//~~tv:20010.20140827 //~~tc: Tealium Custom Container /* Tealium Custom Container Notes: - Add sending code between "Start Tag Sending Code" and "End Tag Sending Code". - Add JavaScript tag library code between "Start Tag Library Code" and "End Tag Library Code". - Add JavaScript code only, do not add HTML code in this file. - Remove any tags from the code you place in this file. Loading external JavaScript files (Loader): - If you need to load an additional external JavaScript file, un-comment the singe-line JavaScript comments ("//") within the following Loader sections near the bottom of this file: - "Start Loader Function Call" - "End Loader Function Call" - "Start Loader Callback Function" - "End Loader Callback Function" - After un-commenting, insert the path to the external JavaScript file you want to load. - Finally, within the Loader callback function, insert the JavaScript code that should run after the external JavaScript file has loaded. */ /* Start Tag Library Code */ /* End Tag Library Code */ //tealium universal tag - utag.sender.custom_container ut4.0.202508160121, Copyright 2025 Tealium.com Inc. All Rights Reserved. try { (function (id, loader) { var u = {}; utag.o[loader].sender[id] = u; // Start Tealium loader 4.32 // Please do not modify if (utag === undefined) { utag = {}; } if (utag.ut === undefined) { utag.ut = {}; } if (utag.ut.loader === undefined) { u.loader = function (o) { var a, b, c, l; a = document; if (o.type === "iframe") { b = a.createElement("iframe"); b.setAttribute("height", "1"); b.setAttribute("width", "1"); b.setAttribute("style", "display:none"); b.setAttribute("src", o.src); } else if (o.type === "img") { utag.DB("Attach img: " + o.src); b = new Image(); b.src = o.src; return; } else { b = a.createElement("script"); b.language = "javascript"; b.type = "text/javascript"; b.async = 1; b.charset = "utf-8"; b.src = o.src; } if (o.id) { b.id = o.id; } if (typeof o.cb === "function") { if (b.addEventListener) { b.addEventListener("load", function () { o.cb(); }, false); } else { b.onreadystatechange = function () { if (this.readyState === "complete" || this.readyState === "loaded") { this.onreadystatechange = null; o.cb(); } }; } } l = o.loc || "head"; c = a.getElementsByTagName(l)[0]; if (c) { utag.DB("Attach to " + l + ": " + o.src); if (l === "script") { c.parentNode.insertBefore(b, c); } else { c.appendChild(b); } } }; } else { u.loader = utag.ut.loader; } // End Tealium loader u.ev = {'view' : 1}; u.initialized = false; u.map={}; u.extend=[function(a,b){ try{ if(1){ /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./src/widget/utilities/logger.js": /*!****************************************!*\ !*** ./src/widget/utilities/logger.js ***! \****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ mobileACSLoggerService; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck function mobileACSLoggerService(label, error) { if (window.location.href.includes('secure')) { if (!window.bactm_envSelector) return; (0,_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Client Logger fired', error); var errorPayload = { "payload": [{ "logLevel": "debug", "entry": "label: ".concat(label, " | error: ").concat(error.message) }] }; var domain = window.location.origin.replace('secure', 'mservice'); var errorURL = "".concat(domain).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.ACS_LOGGER_URL); fetch(errorURL, { headers: { Accept: "application/json", "Content-Type": "application/json" }, method: "POST", body: JSON.stringify(errorPayload), credentials: 'include' }).then(function (res) { console.log(res); })["catch"](function (e) { console.log(e); }); } ; } ; /***/ }), /***/ "./src/widget/events.ts": /*!******************************!*\ !*** ./src/widget/events.ts ***! \******************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _widget_api_co_browse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./widget-api/co-browse */ "./src/widget/widget-api/co-browse.ts"); /* harmony import */ var _widget_api_send_disposition_code__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./widget-api/send-disposition-code */ "./src/widget/widget-api/send-disposition-code.ts"); /* harmony import */ var _widget_api_agent_incentive__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./widget-api/agent-incentive */ "./src/widget/widget-api/agent-incentive.ts"); /* harmony import */ var _sales_request__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sales/request */ "./src/widget/sales/request.ts"); /* harmony import */ var _sales_heartbeat__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sales/heartbeat */ "./src/widget/sales/heartbeat.ts"); /* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts"); /* harmony import */ var _sales_response__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sales/response */ "./src/widget/sales/response.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _sales_request_tc_update__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sales/request-tc-update */ "./src/widget/sales/request-tc-update.ts"); /* harmony import */ var _sales_fetch_refID__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./sales/fetch-refID */ "./src/widget/sales/fetch-refID.ts"); // @ts-nocheck /** @module base/events */ var ah_tokenReceived = false; var refIDRequestReceived = false; var refIDEventData = undefined; // Need to update for final submit page. var shouldFireRefIDCheck = function (requestType) { if (refIDEventData) return (0,_sales_fetch_refID__WEBPACK_IMPORTED_MODULE_10__["default"])(refIDEventData.title, refIDEventData.detail); return; }; /** * Initializing subscriptions * @desc Initialize subscriptions. These subscriptions will wait on publishes from the widget * @example TealiumPubSub.subscribe(COMETD_REQUEST_DISCONNECT, cometdDisconnect); TealiumPubSub.subscribe(COMETD_NOTIFY_STOP_TYPING, cometdTyping); TealiumPubSub.subscribe(COMETD_NOTIFY_START_TYPING, cometdTyping); TealiumPubSub.subscribe(COMETD_NOTIFY_READ_RECEIPT, cometdTyping); TealiumPubSub.subscribe(COMETD_REQUEST_CHANNEL, cometdRequestChannel); TealiumPubSub.subscribe(COMETD_REQUEST_SEND_MESSAGE, cometdSendMessage); TealiumPubSub.subscribe(COMETD_REQUEST_CHANNEL_SUBSCRIPTION, cometdSubscribeChannel); */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, _sales_request__WEBPACK_IMPORTED_MODULE_4__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, _sales_heartbeat__WEBPACK_IMPORTED_MODULE_5__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, _widget_api_agent_incentive__WEBPACK_IMPORTED_MODULE_3__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, _widget_api_co_browse__WEBPACK_IMPORTED_MODULE_1__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, _widget_api_send_disposition_code__WEBPACK_IMPORTED_MODULE_2__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postToCancelSubsOnSite); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_AH_TOKEN, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postToCheckAHToken); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA, _sales_response__WEBPACK_IMPORTED_MODULE_7__.grabHeartbeatData); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, _sales_request_tc_update__WEBPACK_IMPORTED_MODULE_9__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_6__.postNativeChatUpdate); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, function (title, detail) { refIDEventData = { title: title, detail: detail, }; shouldFireRefIDCheck("REF_ID_CHECK_RECEIVED"); }); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_8__.logGenesysEvent)(1, 'TealiumPubSub Subscribing', "subscribing: ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, ", ").concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION)); return false; } /***/ }), /***/ "./src/widget/pubsub/add-pub-sub.ts": /*!******************************************!*\ !*** ./src/widget/pubsub/add-pub-sub.ts ***! \******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _pub_sub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pub-sub */ "./src/widget/pubsub/pub-sub.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module pubsub/add-pub-sub */ /** * In Borneo we need to add the pub script first * Will append newly created div to document * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.determineChatEnv)(); (0,_pub_sub__WEBPACK_IMPORTED_MODULE_0__["default"])(); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'PubSub', 'adding TealiumPubSub'); return false; } /***/ }), /***/ "./src/widget/pubsub/bootstrap.ts": /*!****************************************!*\ !*** ./src/widget/pubsub/bootstrap.ts ***! \****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _add_pub_sub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./add-pub-sub */ "./src/widget/pubsub/add-pub-sub.ts"); /* harmony import */ var _subscriptions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./subscriptions */ "./src/widget/pubsub/subscriptions.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module pubsub/bootstrap */ (0,_add_pub_sub__WEBPACK_IMPORTED_MODULE_1__["default"])(); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION, function () { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION, { spinner: true, version: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.whichVersion)(), container: "chat-placeholder", name: "www-chat", language: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.isSpanish)(), path: (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_3__.getDomain)(), options: { skipBabelPolyFill: true }, }); }); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, _subscriptions__WEBPACK_IMPORTED_MODULE_2__["default"]); /***/ }), /***/ "./src/widget/pubsub/placeholder.ts": /*!******************************************!*\ !*** ./src/widget/pubsub/placeholder.ts ***! \******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module pubsub/placeholder */ /** * Will create div element, add attribute "chat-placeholder" * Will append newly created div to document * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'Placeholder', 'appending div#chat-placeholder to body'); var $div = document.createElement('div'); $div.id = 'chat-placeholder'; document.body.appendChild($div); return false; } /***/ }), /***/ "./src/widget/pubsub/post-messages.ts": /*!********************************************!*\ !*** ./src/widget/pubsub/post-messages.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ postChatDetails: function() { return /* binding */ postChatDetails; }, /* harmony export */ postNativeChatUpdate: function() { return /* binding */ postNativeChatUpdate; }, /* harmony export */ postToCancelSubsOnSite: function() { return /* binding */ postToCancelSubsOnSite; }, /* harmony export */ postToCheckAHToken: function() { return /* binding */ postToCheckAHToken; }, /* harmony export */ sendProxyPostMessage: function() { return /* binding */ sendProxyPostMessage; }, /* harmony export */ setMonitoringStatus: function() { return /* binding */ setMonitoringStatus; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (undefined && undefined.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; /** * PostMessages * The following script provides the post message scripts that provide communication back and forth * with the widget. All of the messages will be kept in this file and not set as a function so the * counters will be remembered and stored. * */ var chatWindow; var chatSiteHost = ""; var siteInfoFired = false; function terminateGenesysChat() { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, "Cancel All Widget Subscriptions", "Suspension of Monitoring Heartbeat Events and All Widget Subs"); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING); TealiumPubSub.clearAllSubscriptions(); } function sendPostMessage(data) { if (!chatSiteHost && window.bactm_envSelector === "notprod") { var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)(); chatSiteHost = v6 ? Object.values(spaWidgetParams["gt-chat-widget"])[0].siteParams.domains[(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)()].chatSiteHost : Object.values(spaWidgetParams["www-chat"])[0].siteParams .domains[(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)()].chatSiteHost; } if (chatWindow) chatWindow.postMessage(data, chatSiteHost); } function handlePostMessage(event) { var _a, _b, _c, _d, _e; var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)(); var widgetName = v6 ? "gt-chat-widget" : "www-chat"; if (event.data === "GET_QS_DDO") { var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)(); chatWindow = (_a = document.getElementById("chatWindow")) === null || _a === void 0 ? void 0 : _a.contentWindow; chatSiteHost = Object.values(spaWidgetParams[widgetName])[0].siteParams .domains[currentTLD].chatSiteHost; chatWindow === null || chatWindow === void 0 ? void 0 : chatWindow.postMessage({ href: window.location.href, ddo: window.digitalData, title: window.document.title, }, chatSiteHost); } if (event.data === "AH_COOKIE_SET") { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)("AH_COOKIE_SET", {}); } if (event.data.event === "chatPreSurveyView") { window.dataCollector.push(event.data); } if (event.data.utagInit) { var v6_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)(); var widgetName_1 = v6_1 ? "gt-chat-widget" : "www-chat"; var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)(); chatWindow = (_b = document.getElementById("chatWindow")) === null || _b === void 0 ? void 0 : _b.contentWindow; chatSiteHost = Object.values(spaWidgetParams[widgetName_1])[0].siteParams .domains[currentTLD].chatSiteHost; var showDebugConsole = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.queryStringParse)("debugChat") === "1"; // setting chatsite spaParams to local kvp on the widget _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams = (_e = (_d = (_c = event === null || event === void 0 ? void 0 : event.data) === null || _c === void 0 ? void 0 : _c.spaParams) === null || _d === void 0 ? void 0 : _d.siteParams) === null || _e === void 0 ? void 0 : _e.domains; // triggering pub/sub that data from the chatsite has been received. var bactmCookies = new bactm.Cookies(); var cookieExists = bactmCookies.get("occtChat"); var occtChatCookie = cookieExists ? JSON.parse(cookieExists) : ""; var chatRefIDFound = occtChatCookie.chatRefID ? occtChatCookie.chatRefID : ""; var ltsCookieExists = bactmCookies.get("occtChat_lts"); var occtChatLtsCookie = ltsCookieExists ? JSON.parse(ltsCookieExists) : ""; var agentIDFound = occtChatLtsCookie.secureAgentID ? occtChatLtsCookie.secureAgentID : ""; var chatIDFound = occtChatLtsCookie.ix_id ? occtChatLtsCookie.ix_id : ""; if (chatIDFound && chatRefIDFound && agentIDFound) { postNativeChatUpdate(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, { currentWebPage: window.document.title, CHAT_ID: chatIDFound, agentID: agentIDFound, }); } if (_widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams && !siteInfoFired) { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams); siteInfoFired = true; } (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, "Site Info Available", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams); var dataToSend = { utagInit: { postMessageOrigin: window.location.origin, showDebugConsole: showDebugConsole, }, }; sendPostMessage(dataToSend); } if (typeof event.data === "string") { if (event.origin !== chatSiteHost) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(2, "Incorrect Post Message Origin", event.origin); return; } switch (event.data) { case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_WIDGET_SUBS: terminateGenesysChat(); break; case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA: TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GRAB_HEARTBEAT_DATA); break; case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_FOR_SALE: // eslint-disable-next-line no-unused-expressions (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA ? checkForSaleIndicators(digitalData.cart, "digitalData.cart", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_SALE_INDICATORS) : checkForSaleIndicators(digitalData.page.attributes.chat, "digitalData.page.attributes.chat", _widget_constants__WEBPACK_IMPORTED_MODULE_0__.ML_SALE_INDICATORS); break; case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_HEARTBEAT: TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING); break; default: break; } } } function checkForSaleIndicators(ddoLocation, ddoLocationStr, saleIndicators) { if (bactm && bactm.polyfills && bactm.polyfills.object.exists(window, ddoLocationStr)) { var salePresInd = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isSalePresent)(ddoLocation); // eslint-disable-next-line no-unused-expressions salePresInd ? sendProxyPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.INQ_CLIENT_ORDER_NUM, salePresInd) : saleIndicators.forEach(function (indicator) { return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.proxyChatDDO)(ddoLocation, indicator); }); } } function postToCancelSubsOnSite() { terminateGenesysChat(); sendPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS); } function postToCheckAHToken() { sendPostMessage(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHECK_AH_TOKEN); } // This sends the nativeChat data to the chatSite function postNativeChatUpdate(eventname, dataToSend) { var nativeChatData = { message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, dataToSend: dataToSend, }; sendPostMessage({ vtimData: __assign({}, nativeChatData) }); } // This is for acs only function postChatDetails(eventname, dataToSend) { var chatAgentDetails = { message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SET_AGENT_ID, dataToSend: dataToSend, }; sendPostMessage({ vtimData: __assign({}, chatAgentDetails) }); } function setMonitoringStatus(state) { if (state === void 0) { state = false; } try { bactm.ddo.set("page.attributes.chat.monitoring", state); var monitoringData = { message: _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SET_MONITORING_STATUS, monitoringStatus: state, }; sendPostMessage({ vtimData: __assign({}, monitoringData) }); } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, "PM setMonitoringStatus Error", e); } } function sendProxyPostMessage(key, newValue) { return __awaiter(this, void 0, void 0, function () { var message; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, window.boa.chat.reload()]; case 1: _a.sent(); message = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SEND_PROXY_DATA; try { sendPostMessage({ vtimData: { message: message, key: key, newValue: newValue, genesysData: window.genesysData }, }); } catch (e) { } return [2 /*return*/]; } }); }); } window.addEventListener("message", handlePostMessage.bind(undefined), false); /***/ }), /***/ "./src/widget/pubsub/pub-sub.ts": /*!**************************************!*\ !*** ./src/widget/pubsub/pub-sub.ts ***! \**************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); // @ts-nocheck /* eslint-disable */ /** * Copyright (c) 2010,2011,2012,2013,2014 Morgan Roderick http://roderick.dk * License: MIT - http://mrgnrdrck.mit-license.org * * https://github.com/mroderick/PubSubJS */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { // TODO in future add interfaces for PubSub to be shared with TealiumPubSub var PubSub = {}; var messages = {}, lastUid = -1; function hasKeys(obj) { var key; for (key in obj) { if (obj.hasOwnProperty(key)) { return true; } } return false; } /** * Returns a function that throws the passed exception, for use as argument for setTimeout * @alias throwException * @function * @param { Object } ex An Error object */ function throwException(ex) { return function reThrowException() { throw ex; }; } function callSubscriberWithDelayedExceptions(subscriber, message, data) { try { subscriber(message, data); } catch (ex) { setTimeout(throwException(ex), 0); } } function callSubscriberWithImmediateExceptions(subscriber, message, data) { subscriber(message, data); } function deliverMessage(originalMessage, matchedMessage, data, immediateExceptions) { var subscribers = messages[matchedMessage], callSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions, s; if (!messages.hasOwnProperty(matchedMessage)) { return; } for (s in subscribers) { if (subscribers.hasOwnProperty(s)) { callSubscriber(subscribers[s], originalMessage, data); } } } function createDeliveryFunction(message, data, immediateExceptions) { return function deliverNamespaced() { var topic = String(message), position = topic.lastIndexOf('.'); // deliver the message as it is now deliverMessage(message, message, data, immediateExceptions); // trim the hierarchy and deliver message to each level while (position !== -1) { topic = topic.substr(0, position); position = topic.lastIndexOf('.'); deliverMessage(message, topic, data, immediateExceptions); } }; } function messageHasSubscribers(message) { var topic = String(message), found = messages.hasOwnProperty(topic) && hasKeys(messages[topic]), position = topic.lastIndexOf('.'); while (!found && position !== -1) { topic = topic.substr(0, position); position = topic.lastIndexOf('.'); found = messages.hasOwnProperty(topic) && hasKeys(messages[topic]); } return found; } function publish(message, data, sync, immediateExceptions) { message = (typeof message === 'symbol') ? message.toString() : message; var deliver = createDeliveryFunction(message, data, immediateExceptions), hasSubscribers = messageHasSubscribers(message); if (!hasSubscribers) { return false; } if (sync === true) { deliver(); } else { setTimeout(deliver, 0); } return true; } /** * Publishes the message, passing the data to it's subscribers * @function * @alias publish * @param { String } message The message to publish * @param {} data The data to pass to subscribers * @return { Boolean } */ PubSub.publish = function (message, data) { return publish(message, data, false, PubSub.immediateExceptions); }; /** * Publishes the the message synchronously, passing the data to it's subscribers * @function * @alias publishSync * @param { String } message The message to publish * @param {} data The data to pass to subscribers * @return { Boolean } */ PubSub.publishSync = function (message, data) { return publish(message, data, true, PubSub.immediateExceptions); }; /** * Subscribes the passed function to the passed message. Every returned token is unique and should be stored if you need to unsubscribe * @function * @alias subscribe * @param { String } message The message to subscribe to * @param { Function } func The function to call when a new message is published * @return { String } */ PubSub.subscribe = function (message, func) { if (typeof func !== 'function') { return false; } message = (typeof message === 'symbol') ? message.toString() : message; // message is not registered yet if (!messages.hasOwnProperty(message)) { messages[message] = {}; } // forcing token as String, to allow for future expansions without breaking usage // and allow for easy use as key names for the 'messages' object var token = 'uid_' + String(++lastUid); messages[message][token] = func; // return token for unsubscribing return token; }; /** * Subscribes the passed function to the passed message once * @function * @alias subscribeOnce * @param { String } message The message to subscribe to * @param { Function } func The function to call when a new message is published * @return { PubSub } */ PubSub.subscribeOnce = function (message, func) { var token = PubSub.subscribe(message, function () { // before func apply, unsubscribe message PubSub.unsubscribe(token); func.apply(this, arguments); }); return PubSub; }; /** * Clears all subscriptions * @function * @public * @alias clearAllSubscriptions */ PubSub.clearAllSubscriptions = function clearAllSubscriptions() { messages = {}; }; /** * Clear subscriptions by the topic * @function * @public * @alias clearAllSubscriptions */ PubSub.clearSubscriptions = function clearSubscriptions(topic) { var m; for (m in messages) { if (messages.hasOwnProperty(m) && m.indexOf(topic) === 0) { delete messages[m]; } } }; /** * Removes subscriptions * * - When passed a token, removes a specific subscription. * * - When passed a function, removes all subscriptions for that function * * - When passed a topic, removes all subscriptions for that topic (hierarchy) * @function * @public * @alias subscribeOnce * @param { String | Function } value A token, function or topic to unsubscribe from * @example // Unsubscribing with a token * var token = PubSub.subscribe('mytopic', myFunc); * PubSub.unsubscribe(token); * @example // Unsubscribing with a function * PubSub.unsubscribe(myFunc); * @example // Unsubscribing from a topic * PubSub.unsubscribe('mytopic'); */ PubSub.unsubscribe = function (value) { var descendantTopicExists = function (topic) { var m; for (m in messages) { if (messages.hasOwnProperty(m) && m.indexOf(topic) === 0) { // a descendant of the topic exists: return true; } } return false; }, isTopic = typeof value === 'string' && (messages.hasOwnProperty(value) || descendantTopicExists(value)), isToken = !isTopic && typeof value === 'string', isFunction = typeof value === 'function', result = false, m, message, t; if (isTopic) { PubSub.clearSubscriptions(value); return; } for (m in messages) { if (messages.hasOwnProperty(m)) { message = messages[m]; if (isToken && message[value]) { delete message[value]; result = value; // tokens are unique, so we can just stop here break; } if (isFunction) { for (t in message) { if (message.hasOwnProperty(t) && message[t] === value) { delete message[t]; result = true; } } } } } return result; }; window.TealiumPubSub = PubSub; } /***/ }), /***/ "./src/widget/pubsub/subscriptions.ts": /*!********************************************!*\ !*** ./src/widget/pubsub/subscriptions.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _widget_api_configure_cobrowse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widget-api/configure-cobrowse */ "./src/widget/widget-api/configure-cobrowse.ts"); /* harmony import */ var _sales_response__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../sales/response */ "./src/widget/sales/response.ts"); /* harmony import */ var _post_messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./post-messages */ "./src/widget/pubsub/post-messages.ts"); // @ts-nocheck /** @module pubsub/subscriptions */ /** * Subscribe Tealium and Sparta widget loader events * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { var SpartaPubSub = window.sparta.chat.widgetLoader; TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_ID_RESPONSE, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PM_SEND_SALE_OCCURRED, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE, _sales_response__WEBPACK_IMPORTED_MODULE_3__["default"]); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURATION, _widget_api_configure_cobrowse__WEBPACK_IMPORTED_MODULE_2__["default"]); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, function (_a) { var detail = _a.detail; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_FETCH_SESSION, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, function (_a) { var detail = _a.detail; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, function (_a) { var detail = _a.detail; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_NATIVE_CHAT, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_CLEAR_HEARTBEAT, function () { return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_CLEAR_HEARTBEAT); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SET_AGENT_ID, function (e) { (0,_post_messages__WEBPACK_IMPORTED_MODULE_4__.postChatDetails)(e.type, e.detail); }); if (window.digitalData && !window.digitalData.on_internal_page) { SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, function (_a) { var detail = _a.detail; return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, function (_a) { var detail = _a.detail; return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_REQUEST, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, function (_a) { var detail = _a.detail; return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE, detail); }); SpartaPubSub.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING, function () { return (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING); }); } SpartaPubSub.pub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.TEALIUM_READY_FOR_PUBSUB, {}); return false; } /***/ }), /***/ "./src/widget/pubsub/widget-script-loaded.ts": /*!***************************************************!*\ !*** ./src/widget/pubsub/widget-script-loaded.ts ***! \***************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }, /* harmony export */ loadLegacyChat: function() { return /* binding */ loadLegacyChat; }, /* harmony export */ loadV6Chat: function() { return /* binding */ loadV6Chat; }, /* harmony export */ publishChatInitialization: function() { return /* binding */ publishChatInitialization; }, /* harmony export */ publishWidgetConfigurationError: function() { return /* binding */ publishWidgetConfigurationError; }, /* harmony export */ publishWidgetConfigurationSuccess: function() { return /* binding */ publishWidgetConfigurationSuccess; }, /* harmony export */ spartaLoaderLoadedEvent: function() { return /* binding */ spartaLoaderLoadedEvent; }, /* harmony export */ subscribeWidgetConfiguration: function() { return /* binding */ subscribeWidgetConfiguration; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events */ "./src/widget/events.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module pubsub/widget-script-loaded */ /** * Once widget configuration load, fires on success * @returns {boolean} */ function publishWidgetConfigurationSuccess() { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, {}); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Widget Configuration Response', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL)); } /** * Once widget configuration load, fires on error * @returns {boolean} */ function publishWidgetConfigurationError() { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR, {}); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(3, 'Widget Configuration Response', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR)); } /** * Subscribes widget configuration event * @param {string} eventName - name of event * @param {object} widgetConfiguration - Widget configuration */ function subscribeWidgetConfiguration(eventName, widgetConfiguration) { var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.isV6)(); if (!v6) { loadLegacyChat({ widgetConfiguration: widgetConfiguration }); } else { widgetConfiguration = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.getV6WidgetConfig)(); loadV6Chat({ widgetConfiguration: widgetConfiguration }); } (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Widget Configuration', widgetConfiguration); return false; } var loadV6Chat = function (_a) { var widgetConfiguration = _a.widgetConfiguration; var loaderVersion = widgetConfiguration.loaderVersion; var v6Config = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.getV6WidgetConfig)(); v6Config.options.onError = function () { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_ERROR, {}); console.log("onError"); }; v6Config.options.onLoad = function () { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL, {}); console.log("onLoad"); }; window.sparta.widgetLoader[loaderVersion].load(v6Config); }; var loadLegacyChat = function (_a) { var widgetConfiguration = _a.widgetConfiguration; window.sparta.chat.widgetLoader.load(widgetConfiguration); window.sparta.chat.widgetLoader.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.errorLoadingWidget, publishWidgetConfigurationError); window.sparta.chat.widgetLoader.sub(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA_WIDGET_READY, publishWidgetConfigurationSuccess); }; /** * Publish chat initialization * @returns {boolean} */ function publishChatInitialization() { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION, {}); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_2__.logGenesysEvent)(1, 'Chat Initialization', "publishing ".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CHAT_INITIALIZATION)); return false; } /** * Document set event, sparta event fired. * @returns {boolean} */ function spartaLoaderLoadedEvent() { (0,_events__WEBPACK_IMPORTED_MODULE_1__["default"])(); publishChatInitialization(); TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.WIDGET_REQUEST_CONFIGURATION, subscribeWidgetConfiguration); return false; } /** * Once widget script has loaded "spartaLoaderLoaded event will * fire" Event will fire callback "spartaLoaderLoadedEvent" * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { if (window.sparta && window.sparta.chat && window.sparta.chat.widgetLoader) { spartaLoaderLoadedEvent(); } else { document.addEventListener('chat.spartaLoaderLoaded', spartaLoaderLoadedEvent); } return false; } /***/ }), /***/ "./src/widget/pubsub/widget-script.ts": /*!********************************************!*\ !*** ./src/widget/pubsub/widget-script.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /** @module pubsub/widget-script */ /** * Create a script tag, widget loader version can change. Set type and src * attribute. If localhost | set to localhost:3005 (widget's default localhost). * Append loader to body. * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__() { var domain = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.getDomain)(); var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isV6)(); // Polyfills script (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'PolyfillScript', 'creating Babel Polyfills Script'); if (!v6) { try { var vtimPolyfills = document.createElement('script'); vtimPolyfills.id = 'vtim-polyfill-script'; var vtimPolyfillsEndpoint = '/spa/widgets/www-chat/3.0.0/spa-assets/components/utilities/platform/babel-polyfill.js?_=' + Date.now(); var vtimPolyfillsURL = domain + vtimPolyfillsEndpoint; vtimPolyfills.src = vtimPolyfillsURL; document.head.appendChild(vtimPolyfills); } catch (e) { console.log(e); } } (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.logGenesysEvent)(1, 'WidgetScript', 'creating Widget Script'); var loader = document.createElement('script'); loader.id = 'loader-script'; loader.dataset.widgetName = 'chat'; var widgetScriptURI = '/spa/widgets/loader/3.0.1/index.js'; loader.type = 'text/javascript'; loader.src = "".concat(domain).concat(widgetScriptURI); document.body.appendChild(loader); return false; } /***/ }), /***/ "./src/widget/sales/fetch-refID.ts": /*!*****************************************!*\ !*** ./src/widget/sales/fetch-refID.ts ***! \*****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }, /* harmony export */ errorFetchSessionEvent: function() { return /* binding */ errorFetchSessionEvent; }, /* harmony export */ successFetchSessionEvent: function() { return /* binding */ successFetchSessionEvent; } /* harmony export */ }); /* harmony import */ var _utilities_fetch_with_retry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/fetch-with-retry */ "./src/widget/utilities/fetch-with-retry.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_get_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utilities/get-cookie */ "./src/widget/utilities/get-cookie.ts"); /* harmony import */ var _utilities_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/logger */ "./src/widget/utilities/logger.js"); // @ts-nocheck var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; /** @module widget-loader/sales/fetch-session */ /** * Error fetchRefSession Event * @param {object} response - Error response * @returns {boolean} */ function errorFetchSessionEvent(response) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_FETCH_SESSION_FAILURE, response); if (bactm && bactm.plugins && bactm.plugins.pixelTag) { bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.PIXEL_TAG_URL, "?error=").concat(response)); } (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Request Fetch Session Failure', response); (0,_utilities_logger__WEBPACK_IMPORTED_MODULE_4__["default"])('getRefIdInfo', response); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); return false; } /** * Success fetchRefSession Event * @param {object} response - Success response * @returns {boolean} * * success response * { * agentID: "6H98FMGB7T7EP9E3VF6QVEDG3S0000DF", * chatID: "A1D3SFA3JE541234A3D567F8A910" * } */ function successFetchSessionEvent(response) { // sets flag to true var currentWebPage = window.document.title; var agentLTS = bactm.Store('chat', { type: 'cookie' }); // this sets bactm_lts cookie certain sales flow check the bactm_lts cookie rather than the occtChat_lts cookie agentLTS.set('secureAgentID', response === null || response === void 0 ? void 0 : response.AGENT_ID); agentLTS.save(); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_FETCH_SESSION_SUCCESS, response); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_REQUEST_NATIVE_CHAT, __assign({ currentWebPage: currentWebPage }, response)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Genesys Request Fetch Session Success', response); return false; } /** * Makes fetchSession request * @param {string} eventName - name of event * @param {string} refID - reference ID - Device ID (GUID) * @param {string} traceID - trace ID - allows for debugging and session tracking */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(event, refID) { var _a, _b, _c; try { if (typeof bactm === 'undefined') { throw new Error('Fetch Request: Bactm not defined'); } ; var bactmLtsCookie = (0,_utilities_get_cookie__WEBPACK_IMPORTED_MODULE_3__["default"])('bactm_lts'); var salesRld = (_b = (_a = bactmLtsCookie === null || bactmLtsCookie === void 0 ? void 0 : bactmLtsCookie.chatService) === null || _a === void 0 ? void 0 : _a.RLD) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes('sales'); var secureAgentID = (_c = bactmLtsCookie === null || bactmLtsCookie === void 0 ? void 0 : bactmLtsCookie.chat) === null || _c === void 0 ? void 0 : _c.secureAgentID; // checking if we have an agentId and if rld is sales, if we have both don't fire refId call if (salesRld && secureAgentID) { console.log('The GetRefIDInfo endpoint will not be called because we already have an agentID'); // return; } var currentTLD_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)(); var fetchRefIDParams_1 = { _CHAT_REF_ID: refID, _TRACE_ID: new Date().getTime() }; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetch Session Request params', fetchRefIDParams_1); var fireRefIDCheck = function (event, chatSiteDomains) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Firing refID fetch', chatSiteDomains); var genesysFetchSessionEndpointURL = "".concat(chatSiteDomains[currentTLD_1].genesys).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.GENESYS_FETCH_SESSION_ENDPOINT); (0,_utilities_fetch_with_retry__WEBPACK_IMPORTED_MODULE_0__["default"])(genesysFetchSessionEndpointURL, { method: 'POST', body: JSON.stringify(fetchRefIDParams_1), headers: { 'Content-Type': 'application/json' }, credentials: 'include' }).then(successFetchSessionEvent).catch(errorFetchSessionEvent); }; // if chatSite params have not been received if (!_widget_constants__WEBPACK_IMPORTED_MODULE_2__.chatSiteParams.spaParams) { // wait for SITE_INFO_AVAILABLE event, then fire fetch request TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.SITE_INFO_AVAILABLE, fireRefIDCheck); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Subscribing to SITE_INFO_AVAILABLE', {}); } else { // fire fetch request fireRefIDCheck(_widget_constants__WEBPACK_IMPORTED_MODULE_2__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_2__.chatSiteParams.spaParams); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetching RefID', {}); } } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Fetch Session Error', e); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); } } /***/ }), /***/ "./src/widget/sales/genesys-data.ts": /*!******************************************!*\ !*** ./src/widget/sales/genesys-data.ts ***! \******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ _initialize; } /* harmony export */ }); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); // @ts-nocheck /** @module sales/genesys-data.js */ function _prepareData(ddo) { var ddoChatData = bactm && bactm.polyfills && bactm.polyfills.object.exists(digitalData, "page.attributes.chat") ? ddo.page.attributes.chat : {}; var genesysDataFn = { siteId: function () { window.inqSiteID = ddoChatData.site_id || ddoChatData.SITE_ID || null; return window.inqSiteID; }, language: function (data) { var language = data.page && data.page.pageInfo && Array.isArray(data.page.pageInfo) && data.page.pageInfo.length > 0 ? data.page.pageInfo[0].language : ""; if (language === "" && typeof fsdNavClientOptions !== "undefined" && fsdNavClientOptions) { language = fsdNavClientOptions.locale; } if (language === "" && data.page && data.page.attributes && data.page.attributes.chat) { language = data.page.attributes.chat.LANGUAGE; } return language; }, // eslint-disable-next-line consistent-return disableChat: function () { if (window.bactm) { var cookies = new window.bactm.Cookies(); var mlo = cookies.get("boa_hlts_mlo"); var qs = new window.bactm.QueryString(); var affiliateCode = qs.get("affiliatecode"); return !!(mlo || affiliateCode); } }, OID: function (data) { return data.user ? data.user.online_id : ""; }, authenticated: function (data) { var _a; var authenticated = ((_a = data === null || data === void 0 ? void 0 : data.user) === null || _a === void 0 ? void 0 : _a.authenticated) ? data.user.authenticated : false; return authenticated; }, buildName: function (data, filter) { var firstName = ""; var lastName = ""; var fullName = ""; if (data.user && data.user.name) { firstName = data.user.name.first || ""; lastName = data.user.name.last || ""; fullName = data.user.name.full || ""; } switch (filter) { case "first": if (firstName === "" && lastName === "") { return fullName; } return firstName; case "last": return lastName; default: return fullName; } }, firstName: function (data) { return genesysDataFn.buildName(data, "first"); }, lastName: function (data) { return genesysDataFn.buildName(data, "last"); }, // eslint-disable-next-line consistent-return firstOffer: function (data, type) { if (data.user && data.user.offers && data.user.offers.length > 0) { for (var offerid in data.user.offers[0]) { switch (type) { case "id": return offerid; case "code": return data.user.offers[0][offerid]; default: } } } else { return ""; } }, firstOfferId: function (data) { return genesysDataFn.firstOffer(data, "id"); }, firstOfferCode: function (data) { return genesysDataFn.firstOffer(data, "code"); }, state: function (data) { return data.user ? data.user.state : ""; }, productName: function (data) { if (!data.product || !Array.isArray(data.product)) return ""; var productNames = []; for (var i = 0; i < data.product.length; i++) { productNames.push(data.product[i].productInfo.productName); } return productNames.join(","); }, categories: function (data) { if (!data.product || !Array.isArray(data.product)) return ""; var categories = []; for (var i = 0; i < data.product.length; i++) { categories.push(data.product[i].category.primaryCategory); } return categories.join(","); }, inqClientOrderNum: function (data) { var value = ddoChatData.inqClientOrderNum; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; window.inqClientOrderNum = value; return value; } return data && data.cart && data.cart.fulfilmentID ? data.cart.fulfilmentID : ""; }, inqOrderType: function () { var value = ddoChatData.inqOrderType; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; window.inqOrderType = value; return value; } return ""; }, inqOtherInfo: function () { var value = ddoChatData.inqOtherInfo; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; window.inqOtherInfo = value; return value; } return ""; }, inqSalesPrices: function () { var value = ddoChatData.inqSalesPrices; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; window.inqSalesPrices = value; return value; } return ""; }, inqSalesProducts: function () { var value = ddoChatData.inqSalesProducts; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; if (!Array.isArray(value)) value = [value]; window.inqSalesProducts = value; return value; } return ""; }, inqSalesProductTypes: function () { var value = ddoChatData.inqSalesProductTypes; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; if (!Array.isArray(value)) value = [value]; window.inqSalesProductTypes = value; return value; } return ""; }, inqSalesQuantities: function () { var value = ddoChatData.inqSalesQuantities; if (value) { if (Array.isArray(value) && value.length === 0) return ""; if (typeof value === "object" && Object.keys(value).length === 0 && value.constructor === Object) return ""; if (typeof value === "string" && value === "[]") return ""; if (!Array.isArray(value)) value = [value]; window.inqSalesQuantities = value; return value; } return ""; }, preferredRewardsTier: function (data) { return data.user && data.user.preferred_rewards_tier ? data.user.preferred_rewards_tier : ""; }, pageID: function (data) { var _a, _b; // Assuming dataCollector is an array of objects with an 'event' property var dataCollector = Array.isArray(window.dataCollector) ? window.dataCollector : []; // Ensure dataCollector is an array var pageViews = dataCollector.filter(function (_a) { var event = _a.event; return event === "pageview"; }); var pageView = pageViews && Array.isArray(pageViews) && pageViews.length > 0 ? pageViews.slice(-1) : null; if (data.page && data.page.pageInfo && Array.isArray(data.page.pageInfo) && data.page.pageInfo.length > 0) { if (pageView && Array.isArray(pageView) && pageView.length > 0 && "pageInfoKey" in pageView[0]) { return "pageInfoKey" in pageView[0] && typeof pageView[0].pageInfoKey === "string" && ((_a = data.page.pageInfo[pageView[0].pageInfoKey]) === null || _a === void 0 ? void 0 : _a.pageID) ? (_b = data.page.pageInfo[pageView[0].pageInfoKey]) === null || _b === void 0 ? void 0 : _b.pageID : ""; } else { return data.page.pageInfo[0].pageID; } } else { return ""; } }, searchQuery: function (data) { return data.page && data.page.attributes ? data.page.attributes.searchString : ""; }, searchResult: function (data) { return data.page && data.page.attributes ? data.page.attributes.searchResults : ""; }, }; window.genesysData = { ACCOUNT_TYPE: ddoChatData.account_type, APPLICATION: genesysDataFn.pageID(ddo), AUTHENTICATED: genesysDataFn.authenticated(ddo), BOA_ASSOCIATE: ddoChatData.boa_associate, BOA_RETIREE: ddoChatData.boa_retiree, CANCELREASON: ddoChatData.cancel_reason, CAT: genesysDataFn.categories(ddo), COMPANY_NAME: ddoChatData.company_name, CONVERSION_STAGE: ddoChatData.conversion_stage, CUSTOMER_LOB: ddoChatData.customer_lob, CUSTOMER_SEGMENT: ddoChatData.customer_segment, DATA: ddoChatData.data, DISABLE_CHAT: genesysDataFn.disableChat(), ENTITLEMENT_CODE: ddoChatData.entitlement_code, ERROR_COUNT: ddoChatData.error_count, FIRST_LOGIN: ddoChatData.first_login, FIRSTNAME: genesysDataFn.firstName(ddo), inqClientOrderNum: genesysDataFn.inqClientOrderNum(), inqOrderType: genesysDataFn.inqOrderType(), inqOtherInfo: genesysDataFn.inqOtherInfo(), inqSalesPrices: genesysDataFn.inqSalesPrices(), inqSalesProducts: genesysDataFn.inqSalesProducts(), inqSalesProductTypes: genesysDataFn.inqSalesProductTypes(), inqSalesQuantities: genesysDataFn.inqSalesQuantities(), inqSiteID: genesysDataFn.siteId(), LANGUAGE: genesysDataFn.language(ddo), LASTNAME: genesysDataFn.lastName(ddo), NAM: genesysDataFn.productName(ddo), ONLINE_ID: genesysDataFn.OID(ddo), OFR: genesysDataFn.firstOfferId(ddo), OFFER_CODE: genesysDataFn.firstOfferCode(ddo), PAGE_TYPE: ddoChatData.PageType, PAGE_LOADTIME: ddoChatData.page_loadtime, PREFERRED_REWARDS_TIER: genesysDataFn.preferredRewardsTier(ddo), PREQUALIFICATION: genesysDataFn.pageID(ddo), PRODUCT_DISPLAY: genesysDataFn.productName(ddo), PRODUCT_TYPE: ddoChatData.Product_type, PRODUCT_VIEW: genesysDataFn.productName(ddo), PRODUCTSELECTION_PURCHASEFLOW: genesysDataFn.pageID(ddo), REFERRAL_CAMPAIGN: ddoChatData.referral_campaign, STATE: genesysDataFn.state(ddo), SUB_SECTION: ddoChatData.Sub_Section, TIMEZONE: ddoChatData.timezone, TOOL_INTERNALSEARCHQUERY: genesysDataFn.searchQuery(ddo), TOOL_INTERNALSEARCHRESULT: genesysDataFn.searchResult(ddo), TOPIC_SELECTION: ddoChatData.topic_selection, }; function validateValue(value) { var empty = value === "" || value === null || typeof value === "undefined" || !(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isEmptyArr)(value) || !(0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isEmptyObj)(value); return !empty; } for (var item in genesysData) { if (validateValue(genesysData[item])) { // eslint-disable-next-line no-continue continue; } else { delete genesysData[item]; } } } function _reload() { if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.MERRILL || (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.INTERNAL) { window.genesysData = {}; window.genesysData = bactm && bactm.ddo ? bactm.ddo.get("page.attributes.chat") : digitalData.page.attributes.chat; } else { var ddo = window.digitalData; _prepareData(ddo); } return false; } function _initialize() { if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.MERRILL || (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichDomain)() === _widget_constants__WEBPACK_IMPORTED_MODULE_1__.INTERNAL) { window.genesysData = {}; window.genesysData = bactm && bactm.ddo ? bactm.ddo.get("page.attributes.chat") : digitalData.page.attributes.chat; // eslint-disable-next-line no-unused-vars var refreshGenesysData = setInterval(_reload, 15000); } else { var ddo = window.digitalData; _prepareData(ddo); // eslint-disable-next-line no-unused-vars var refreshGenesysData = setInterval(_reload, 15000); } } window.boa = window.boa || {}; window.boa.chat = { init: _initialize, reload: _reload, }; /***/ }), /***/ "./src/widget/sales/grab-data.ts": /*!***************************************!*\ !*** ./src/widget/sales/grab-data.ts ***! \***************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ handleGrabData; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); // @ts-nocheck var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; /** @module sales/grab-data */ /** * Check if two arrays are equal * @param {Array} arr1 The first array * @param {Array} arr2 The second array * @return {Boolean} If true, both arrays are equal */ // eslint-disable-next-line func-names var arraysMatch = function checkArrs(arr1, arr2) { // Check if the arrays are the same length if (arr1.length !== arr2.length) return false; // Check if all items exist and are in the same order for (var i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } // Otherwise, return true return true; }; /** * Compare two items and push non-matches to object * @param {*} item1 The first item * @param {*} item2 The second item * @param {String} key The key in our object * @returns {Object} diffs The differences between the objects */ // eslint-disable-next-line func-names var compare = function compareItems(item1, item2, key, diffs) { // Get the object type var type1 = Object.prototype.toString.call(item1); var type2 = Object.prototype.toString.call(item2); // If type2 is undefined it has been removed if (type2 === '[object Undefined]') { // eslint-disable-next-line no-param-reassign diffs[key] = null; } // If items are different types if (type1 !== type2) { // eslint-disable-next-line no-param-reassign diffs[key] = item2; } // If an object, compare recursively if (type1 === '[object Object]') { var objDiff = diff(item1, item2); if (Object.keys(objDiff).length > 1) { // eslint-disable-next-line no-param-reassign diffs[key] = objDiff; } } // If an array, compare if (type1 === '[object Array]') { if (!arraysMatch(item1, item2)) { // eslint-disable-next-line no-param-reassign diffs[key] = item2; } } // Else if it's a function, convert to a string and compare // Otherwise, just compare if (type1 === '[object Function]') { if (item1.toString() !== item2.toString()) { // eslint-disable-next-line no-param-reassign diffs[key] = item2; } } else if (item1 !== item2) { // eslint-disable-next-line no-param-reassign diffs[key] = item2; } return diffs; }; /** * Find the differences between two objects and push to a new object * @param {Object} obj1 The original object * @param {Object} obj2 The object to compare against it * @return {Object} An object of differences between the two */ // eslint-disable-next-line func-names var diff = function findDifferences(obj1, obj2) { // Make sure an object to compare is provided if (!obj2 || Object.prototype.toString.call(obj2) !== '[object Object]') { return obj1; } // Variables var diffs = {}; // Loop through the first object for (var i = 0, keys = Object.keys(obj1); i < keys.length; i++) { diffs = compare(obj1[keys[i]], obj2[keys[i]], keys[i], diffs); } // Loop through the second object and find missing items for (var i = 0, keys = Object.keys(obj2); i < keys.length; i++) { if (!obj1[keys[i]] && obj1[keys[i]] !== obj2[keys[i]]) { diffs[keys[i]] = obj2[keys[i]]; } } // Return the object of differences return diffs; }; /** * Handle grabbing data * @returns {object} */ function handleGrabData(data, keyboardTimestamp, mouseTimestamp) { var newData; if (Object.keys(data).length === 0) { // eslint-disable-next-line no-param-reassign data = window.genesysData; } else { newData = window.genesysData; } var deltaData = diff(data, newData); var userKeyboardActivity = keyboardTimestamp; var userMouseActivity = mouseTimestamp; var dataToSend; if (userKeyboardActivity && userMouseActivity) { dataToSend = __assign(__assign({}, deltaData), { userKeyboardActivity: userKeyboardActivity, userMouseActivity: userMouseActivity }); } else if (userKeyboardActivity) { dataToSend = __assign(__assign({}, deltaData), { userKeyboardActivity: userKeyboardActivity }); } else if (userMouseActivity) { dataToSend = __assign(__assign({}, deltaData), { userMouseActivity: userMouseActivity }); } else { dataToSend = __assign({}, deltaData); } TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT, dataToSend); var newOriginalData = __assign(__assign({}, data), newData); return newOriginalData; } /***/ }), /***/ "./src/widget/sales/heartbeat.ts": /*!***************************************!*\ !*** ./src/widget/sales/heartbeat.ts ***! \***************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module sales/heartbeat */ /** * DigitalDataObject is merged with TCData * @param {string} eventName - name of event * @param {string} payload - heartbeat data (DDO Data Values) * @returns {boolean} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, payload) { try { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Monitoring Heartbeat', payload); _gt.push(['event', 'heartbeat', { data: payload }]); } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Monitoring Heartbeat Error', e); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_HEARTBEAT_FAILURE, e); if (bactm && bactm.plugins && bactm.plugins.pixelTag) bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); } return false; } /***/ }), /***/ "./src/widget/sales/request-tc-update.ts": /*!***********************************************!*\ !*** ./src/widget/sales/request-tc-update.ts ***! \***********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }, /* harmony export */ errorTCUpdateEvent: function() { return /* binding */ errorTCUpdateEvent; }, /* harmony export */ successTCUpdateEvent: function() { return /* binding */ successTCUpdateEvent; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _utilities_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utilities/logger */ "./src/widget/utilities/logger.js"); // @ts-nocheck /** * Error tc-update Event * @param {object} response - Error response * @returns {boolean} */ function errorTCUpdateEvent(response) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE_FAILURE, response); if (bactm && bactm.plugins && bactm.plugins.pixelTag) { bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(response)); } (0,_utilities_logger__WEBPACK_IMPORTED_MODULE_2__["default"])('updateChatData', response); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'TC-Update Request Failure', response); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); return false; } /** * Success tc-update Event * @param {object} response - Success Response * @returns {boolean} * * success response * { * "Reason": "Successfully Updated", * "Id": "TBKKO53JJH26P227A9KCB8BNHG000UCA", * "IsChatActive": "N" * } */ function successTCUpdateEvent(response) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.publishWindow)(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_REQUEST_TC_UPDATE_SUCCESS, response); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'GENESYS REQUEST TC UPDATE SUCCESS', response); return false; } /** * Makes terms and conditions update * @param {string} eventName - name of event * @param {object} payload - name of event * payload example * "{\"OFFER_MGMT\":[{\"currentUrl\":\"https://www.bankofamerica.com/credit-cards/products/cash-back-credit-card/?campaign=4063778~EK~en_US\",\"referrer\":\"https://www.bankofamerica.com/credit-cards/\",\"productName\":\"Bank of America Customized Cash Rewards Credit Card\",\"tcLink\":\"https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4063778&productoffercode=EK&locale=en_US\",\"timeStamp\":\"1:37:31 PM\",\"pageType\":\"research\"},{\"currentUrl\":\"https://www.bankofamerica.com/credit-cards/products/unlimited-cash-back-student-credit-card/\",\"referrer\":\"https://www.bankofamerica.com/credit-cards/student-credit-cards/\",\"productName\":\"Bank of America Unlimited Cash Rewards Credit Card for Students\",\"tcLink\":\"https://www.bankofamerica.com/credit-cards/terms-and-conditions/?campaignid=4063922&productoffercode=S7&locale=en_US\",\"timeStamp\":\"1:48:08 PM\",\"pageType\":\"research\"}]}" */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(event, _a) { var chatID = _a.chatID, OFFER_MGMT = _a.OFFER_MGMT; try { if (typeof bactm === 'undefined') { throw new Error('GENESYS REQUEST TC UPDATE REQUEST unable to process'); } var genesysData_1 = { OFFER_MGMT: OFFER_MGMT }; if (chatID && OFFER_MGMT) { var interactionID = chatID; var currentTLD_1 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)(); var GSID = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getGSID)(); var jsonUserData = JSON.stringify(genesysData_1); var genesysTCUpdateParams_1 = { _interaction_id: interactionID, _userdata: jsonUserData, _GSID: GSID, _updateForActiveChatOnly: 'Y' }; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'GENESYS TERMS AND CONDITIONS UPDATE PARAMS', genesysTCUpdateParams_1); var fireTCCheck_1 = function (event, chatSiteSpaParams) { var genesysNativeChatEndpoint = "".concat(chatSiteSpaParams[currentTLD_1].genesys).concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_UPDATE_CHAT_DATA_ENDPOINT); fetch(genesysNativeChatEndpoint, { method: 'POST', body: JSON.stringify(genesysTCUpdateParams_1), headers: { 'Content-Type': 'application/json' }, credentials: 'include' }).then(function (resp) { return resp.json(); }).then(successTCUpdateEvent).catch(errorTCUpdateEvent); }; // if chatSite params have not been received if (!_widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams) { // wait for SITE_INFO_AVAILABLE event, then fire fetch request TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, function (eventName, data) { fireTCCheck_1(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, data); }); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Fetching chatSiteParams for TC Call', {}); } else { // fire fetch request fireTCCheck_1(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.SITE_INFO_AVAILABLE, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams.spaParams); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Firing TC Update Fetch request', _widget_constants__WEBPACK_IMPORTED_MODULE_0__.chatSiteParams); } } else { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Chat ID undefined', chatID); } } catch (e) { errorTCUpdateEvent(e); } } /***/ }), /***/ "./src/widget/sales/request.ts": /*!*************************************!*\ !*** ./src/widget/sales/request.ts ***! \*************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; /* eslint-disable */ /** @module sales/request */ /** * Configure monitoringJS xml, and gtcj for heartbeat * @param {string} eventName - name of event * @param {object} requestConfiguration - domain and URI dslResource | httpEndpoint | httpsEndpoint | gtcjEndpoint * @returns {boolean} */ /* harmony default export */ __webpack_exports__["default"] = (function (eventName, requestConfiguration) { try { var isMonitoring = bactm.ddo.get('page.attributes.chat.monitoring'); if (isMonitoring) return; window._gt = window._gt || []; var httpsEndpoint = requestConfiguration.httpsEndpoint, httpEndpoint = requestConfiguration.httpEndpoint, resourcePath = requestConfiguration.resourcePath, gtcjEndpoint = requestConfiguration.gtcjEndpoint; var protocol = (document.location.protocol === 'https:' ? httpsEndpoint : httpEndpoint); var configuration = { dslResource: "".concat(protocol, "/").concat(resourcePath), httpEndpoint: httpEndpoint, httpsEndpoint: httpsEndpoint, gtcjEndpoint: gtcjEndpoint, }; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Monitoring Request', requestConfiguration); // <---------------------------------------------------------------------------> // May remove this section because the domain-xml.mins.js is being posted twice. // This particular posting has no variables with the posting, so initial analysis points to no functional value. _gt.push(['config', configuration]); (function (d, s, id, o) { var _a; var fs = d.getElementsByTagName(s)[0]; var e; if (d.getElementById(id)) return; e = d.createElement(s); e.id = id; e.src = o.src; (_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs); }(document, 'script', 'domain-xml', { src: configuration.dslResource, })); // <---------------------------------------------------------------------------> _gt.push(['getIDs', function (IDs) { var queryStrings = new bactm.QueryString(window.location.href); var cookies = new bactm.Cookies('occtChat'); var checkCookie = cookies.get('occtChat'); var occtChatCookie = JSON.parse(checkCookie); var determineNativeChat = (window.location.href.includes('nativeChat=available') ? 'available' : (window.location.href.includes('nativeChat=active') ? 'active' : false)); // need this because bactm.querystring is thrown off by weird urls. var determineChatID = function () { if (window.location.href.split('?')[1]) { if (window.location.href.split('?')[1].split('chatID=')[1]) { return window.location.href.split('?')[1].split('chatID=')[1].split('&')[0].split('#')[0]; } } return undefined; }; // TODOS: Will look at this later // const nativeChat = occtChatCookie?.nativeChat || queryStrings.get('nativeChat') || determineNativeChat; // const chatID = occtChatCookie?.chatID || queryStrings.get('chatID') || determineChatID(); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORING_ID_RESPONSE, __assign({}, IDs)); }]); (function (d, s, id, o) { var _a; var fs = d.getElementsByTagName(s)[0]; var e; if (d.getElementById(id)) return; e = d.createElement(s); e.id = id; e.src = o.src; (_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs); }(document, 'script', '_gt', { src: "".concat(configuration.httpsEndpoint, "/").concat(configuration.gtcjEndpoint), })); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE, {}); } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, "Monitoring Request Error", e); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.MONITORINGJS_RESPONSE_FAILURE, e); if (bactm && bactm.plugins && bactm.plugins.pixelTag) bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); } return false; }); /***/ }), /***/ "./src/widget/sales/response.ts": /*!**************************************!*\ !*** ./src/widget/sales/response.ts ***! \**************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ handleMonitoringResponse; }, /* harmony export */ grabHeartbeatData: function() { return /* binding */ grabHeartbeatData; } /* harmony export */ }); /* harmony import */ var _grab_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./grab-data */ "./src/widget/sales/grab-data.ts"); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts"); // @ts-nocheck /** @module sales/response */ var originalData = {}; var mouseEvent; var keyboardEvent; document.addEventListener('keyup', function () { keyboardEvent = Date.now(); }); document.addEventListener('mousemove', function () { mouseEvent = Date.now(); }); /** * Handle monitoring response * @returns {boolean} */ function handleMonitoringResponse() { var heartbeatsSent = 0; (0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__.setMonitoringStatus)(true); var heartbeatTimer = setInterval(function () { if (document.visibilityState === 'visible') { if (heartbeatsSent < 20) { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.CHECK_AH_TOKEN); heartbeatsSent++; } else { clearHeartbeat(); } } }, 30000); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.CHECK_AH_TOKEN); function clearHeartbeat() { (0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__.setMonitoringStatus)(false); clearInterval(heartbeatTimer); TealiumPubSub.unsubscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_SUSPEND_MONITORING); } TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_SUSPEND_MONITORING, clearHeartbeat); } function grabHeartbeatData() { originalData = (0,_grab_data__WEBPACK_IMPORTED_MODULE_0__["default"])(originalData, keyboardEvent, mouseEvent); } /***/ }), /***/ "./src/widget/utilities/fetch-with-retry.ts": /*!**************************************************!*\ !*** ./src/widget/utilities/fetch-with-retry.ts ***! \**************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ fetchWithRetry; } /* harmony export */ }); // @ts-nocheck var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (undefined && undefined.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; // this utility method allows us to properly handle all network request errors // this also allows us to retry network calls, omit the retry parameter will effectively turn off retries // example usage: // import fetchWithRetry from '../utilities/fetch-with-retry' // import { MAX_ERR_RETRIES } from './widget-constants'; // fetchWithRetry('http://localhost:4000/mock_refID', { // method: 'POST', // body: JSON.stringify(body), // headers: {'Content-Type': 'application/json'} // }, MAX_ERR_RETRIES) // .then((response) => console.log('SUCCCESS with retry', response)) // .catch((response) => console.log('ERROR with retry', response)); function fetchWithRetry(url, options, retries) { if (retries === void 0) { retries = 0; } return __awaiter(this, void 0, void 0, function () { var response, sanitizeRetry; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fetch(url, options)]; case 1: response = _a.sent(); if (!response.ok) { sanitizeRetry = Math.abs(retries); if (sanitizeRetry > 0) return [2 /*return*/, fetchWithRetry(url, options, sanitizeRetry - 1)]; throw Error(response.statusText); } else { return [2 /*return*/, response.json()]; } return [2 /*return*/]; } }); }); } /***/ }), /***/ "./src/widget/utilities/get-cookie.ts": /*!********************************************!*\ !*** ./src/widget/utilities/get-cookie.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ getCookieStorage; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); // @ts-nocheck /** @module utilities/get-cookie */ function getCookieStorage(name) { if (name === void 0) { name = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE.NAME; } var lookup = "".concat(name, "="); var decodedCookie = decodeURIComponent(document.cookie); var cookieArr = decodedCookie.split(';'); for (var i = 0; i < cookieArr.length; i += 1) { var cookie = cookieArr[i]; while (cookie.charAt(0) === ' ') { cookie = cookie.substring(1); } if (cookie.indexOf(lookup) === 0) { return JSON.parse(cookie.substring(lookup.length, cookie.length)); } } return {}; } /***/ }), /***/ "./src/widget/utilities/set-cookie.ts": /*!********************************************!*\ !*** ./src/widget/utilities/set-cookie.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ setCookieStorage; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _get_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get-cookie */ "./src/widget/utilities/get-cookie.ts"); // @ts-nocheck /** @module utilities/set-cookie */ function setCookieStorage(payload, cookie) { if (cookie === void 0) { cookie = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE; } var stringifiedValue = JSON.stringify(Object.assign((0,_get_cookie__WEBPACK_IMPORTED_MODULE_1__["default"])(cookie.NAME), payload)); var isLocal = window.sparta.env === 'local'; var expiry = "; expires=".concat((new Date(Date.now() + (cookie.EXPIRATION * 24 * 60 * 60 * 1000))).toUTCString()); var domain = isLocal ? '' : "; domain=".concat(cookie.DOMAIN); var secure = (cookie.SECURE && !isLocal) ? '; secure' : ''; var cookieInfo = "".concat(cookie.NAME, "=").concat(stringifiedValue).concat(expiry, "; path=").concat(cookie.PATH).concat(domain).concat(secure); window.document.cookie = cookieInfo; } /***/ }), /***/ "./src/widget/utilities/utilities.ts": /*!*******************************************!*\ !*** ./src/widget/utilities/utilities.ts ***! \*******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ checkWrap: function() { return /* binding */ checkWrap; }, /* harmony export */ determineChatEnv: function() { return /* binding */ determineChatEnv; }, /* harmony export */ getCurrentDomain: function() { return /* binding */ getCurrentDomain; }, /* harmony export */ getDomain: function() { return /* binding */ getDomain; }, /* harmony export */ getGSID: function() { return /* binding */ getGSID; }, /* harmony export */ getHostName: function() { return /* binding */ getHostName; }, /* harmony export */ getTopLevelDomain: function() { return /* binding */ getTopLevelDomain; }, /* harmony export */ getV6WidgetConfig: function() { return /* binding */ getV6WidgetConfig; }, /* harmony export */ increaseErrorCount: function() { return /* binding */ increaseErrorCount; }, /* harmony export */ isEmptyArr: function() { return /* binding */ isEmptyArr; }, /* harmony export */ isEmptyObj: function() { return /* binding */ isEmptyObj; }, /* harmony export */ isInternal: function() { return /* binding */ isInternal; }, /* harmony export */ isMerrill: function() { return /* binding */ isMerrill; }, /* harmony export */ isSalePresent: function() { return /* binding */ isSalePresent; }, /* harmony export */ isSecureQA: function() { return /* binding */ isSecureQA; }, /* harmony export */ isSpanish: function() { return /* binding */ isSpanish; }, /* harmony export */ isSparta: function() { return /* binding */ isSparta; }, /* harmony export */ isUniversalHeader: function() { return /* binding */ isUniversalHeader; }, /* harmony export */ isV6: function() { return /* binding */ isV6; }, /* harmony export */ logGenesysEvent: function() { return /* binding */ logGenesysEvent; }, /* harmony export */ mockRefID: function() { return /* binding */ mockRefID; }, /* harmony export */ proxyChatDDO: function() { return /* binding */ proxyChatDDO; }, /* harmony export */ publishTealium: function() { return /* binding */ publishTealium; }, /* harmony export */ publishWindow: function() { return /* binding */ publishWindow; }, /* harmony export */ qsLobSetter: function() { return /* binding */ qsLobSetter; }, /* harmony export */ queryStringParse: function() { return /* binding */ queryStringParse; }, /* harmony export */ whichDomain: function() { return /* binding */ whichDomain; }, /* harmony export */ whichVersion: function() { return /* binding */ whichVersion; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts"); /* harmony import */ var _get_cookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./get-cookie */ "./src/widget/utilities/get-cookie.ts"); /* harmony import */ var _set_cookie__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./set-cookie */ "./src/widget/utilities/set-cookie.ts"); /** @module utilities/utilities */ /** * isInternal * We will check the url for internal sites to default them to source URL for widget * @returns {boolean} */ function isInternal() { return (window.location.href.indexOf("//ghrsiebel") > -1 || window.location.href.indexOf("//aconline") > -1 || window.location.href.indexOf("//askhr") > -1); } /** * isMerrill * We will check the url for .ml or .merrilledge and if so then it is a Merrill configuration * @returns {boolean} */ function isMerrill() { return (window.location.host.indexOf(".ml") > -1 || window.location.host.indexOf(".merrilledge") > -1); } /** * isSparta * We will check the url for sparta. and if so then it is on a Sparta site * @returns {boolean} */ function isSparta() { return window.location.host.indexOf("sparta.") > -1; } /** * isSecureQA * QA5 and QAPS are unable to load dev/cert domains. This already happens natural for www, * but secure will need to be routed * @returns {boolean} */ function isSecureQA() { return (window.location.host.indexOf("-qa5") > -1 || window.location.host.indexOf("-qaps") > -1); } /** * whichDomain * This will be utilize to determine which widgetScript to load; which domain to point * when referencing the widget, and to determine which preconnect/polling attributes to pull * @returns {string} */ function whichDomain() { if (isMerrill()) { return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MERRILL; } if (isInternal()) { return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INTERNAL; } if (isSparta()) { return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA; } return _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA; } /** * We have two different language versions of chat. A Spanish version and an English version. We * will load the corresponding version that relates to language value of the page. * @returns {string} */ function isSpanish() { var spanishIdentifiers = ["es-us", "es", "spanish", "espanol"]; var language = window.genesysData && window.genesysData.LANGUAGE ? window.genesysData.LANGUAGE : "en"; // eslint-disable-next-line no-shadow var isSpanish = false; if (typeof language === "string" && spanishIdentifiers.indexOf(language.toLowerCase()) > -1) { isSpanish = true; } return isSpanish ? "es" : "en"; } /** * queryStringParse * Used to parse out query string values to provide a modified chat experience in LLEs * @param {string} name - name for query string to parse * @returns {string} */ function queryStringParse(name) { var url = window.location.href; var regex = new RegExp("[?&]".concat(name, "(=([^&#]*)|&|#|$)")); var results = regex.exec(url); if (results && results[2]) return decodeURIComponent(results[2]); return ""; } /** * whichVersion * We will now have multiple versions of www-chat/secure-chat. * So we will check for which version to use which will be sent as a parameter * attached to a query string * @returns {string} */ function whichVersion() { var v6 = isV6(); if (!v6) { if (window.bactm_envSelector === "notprod") { var version = queryStringParse("widgetVersion"); if (version !== "") return version; return "3.0.0"; } return "3.0.0"; } return "1.0.0"; } /** * get V6 widget configuration * @returns {string} */ function getV6WidgetConfig() { var gtChatWidget = { name: "gt-chat-widget", version: "1.0.0", path: getDomain(), spinner: false, loaderVersion: "6.0.5", container: "#chat-placeholder", options: { data: { v6: true }, withoutCredentials: true, } }; return gtChatWidget; } /** * Identify if version is V6 * * Collaborators code for V5 or V6 identification * * */ function isV6() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; var isV6 = false; var queryParams = new URLSearchParams(window.location.search); // Parse query string var queryEnabled = queryParams.get("v6") === "true"; // Check if v6 exists and is "true" var ddoEnabled = Array.isArray((_b = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.page) === null || _b === void 0 ? void 0 : _b.pageInfo) ? (_e = (_d = (_c = window.digitalData.page.pageInfo[0]) === null || _c === void 0 ? void 0 : _c.attributes) === null || _d === void 0 ? void 0 : _d.chat) === null || _e === void 0 ? void 0 : _e.v6 : (_k = (_j = (_h = (_g = (_f = window === null || window === void 0 ? void 0 : window.digitalData) === null || _f === void 0 ? void 0 : _f.page) === null || _g === void 0 ? void 0 : _g.pageInfo) === null || _h === void 0 ? void 0 : _h.attributes) === null || _j === void 0 ? void 0 : _j.chat) === null || _k === void 0 ? void 0 : _k.v6; if (queryEnabled || ddoEnabled) isV6 = true; return isV6; } /** * getDomain * Function designed to automate the URL process regardless of site or location of chat. * @returns {string} */ function getDomain() { var isProd = window.bactm_envSelector === "prod"; if (!isProd) { var env = queryStringParse("chatEnv"); if (env !== "") return "https://www-".concat(env, ".ecnp.bankofamerica.com"); if (window.location.host.indexOf("localhost") > -1) return "http://localhost:3005"; } switch (whichDomain()) { case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA: if (isProd) { return "https://www.bankofamerica.com"; } var hostName = window.location.hostname.toLowerCase(); if (hostName.indexOf("sit1") > -1 || hostName.indexOf("preview1") > -1) { return "https://www-sit1a-helix.ecnp.bankofamerica.com"; } if (hostName.indexOf("sit2") > -1 || hostName.indexOf("preview2") > -1) { return "https://www-sit2a-helix.ecnp.bankofamerica.com"; } for (var i = 0; i < _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS.length; i++) { if (window.location.hostname.indexOf(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS[i]) > -1) { return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_DOMAINS[i], "ecnp.bankofamerica.com"); } } return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, "-helix.ecnp.bankofamerica.com"); case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MERRILL: if (isProd) { var mlDomain = getCurrentDomain(); return "https://chatui.".concat(mlDomain); } else { var hn = window.location.hostname; var CERT = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, DEV = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV; var determineCert = hn.includes("pl1") || hn.includes("pl2") || hn.includes("sit1") || hn.includes("sit2"); if (hn.includes("merrilledgesit1")) return "https://chatui.merrilledgesit1.com"; if (hn.includes("merrilledgesit2")) return "https://chatui.merrilledgesit2.com"; if (hn.includes("fssit1.ml.com")) return "https://chatui.fssit1.ml.com"; if (hn.includes("fssit2.ml.com")) return "https://chatui.fssit2.ml.com"; if (hn.includes("benefitssit2.ml.com")) return "https://chatui.benefitssit2.ml.com"; if (hn.includes("benefitssit1.ml.com")) return "https://chatui.benefitssit1.ml.com"; if (hn.includes("secure-dev3.oldif")) return "https://chatui-dev3.ml.com"; if (determineCert) return "https://chatui-".concat(CERT, ".ml.com"); return "https://chatui-".concat(DEV, ".ml.com"); } case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INTERNAL: if (isProd) { return "https://www.bankofamerica.com"; } // eslint-disable-next-line no-case-declarations var intEnv = window.location.hostname.includes("-uat") || window.location.hostname.includes("qa.") ? _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT : _widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV; return "https://www-".concat(intEnv, "-helix.ecnp.bankofamerica.com"); case _widget_constants__WEBPACK_IMPORTED_MODULE_0__.SPARTA: // eslint-disable-next-line no-case-declarations var spartaEnv = queryStringParse("environment"); if (spartaEnv !== "" && spartaEnv.startsWith("https")) return spartaEnv; return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.DEV, "-helix.ecnp.bankofamerica.com"); default: return "https://www-".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.IR_ENV.CERT, "-helix.ecnp.bankofamerica.com"); } } /** * isEmptyObj * Function designed to check if an object is empty (returns true) or contains * key/value pairs (returns false) * @returns {boolean} */ function isEmptyObj(obj) { if (typeof obj === "object") { for (var key in obj) { // eslint-disable-next-line no-prototype-builtins if (obj.hasOwnProperty(key)) return false; } return true; } return true; } /** * isEmptyArr * Function designed to check if an array is empty (returns true) or contains items (returns false) * @param {array} arr * @returns {boolean} */ function isEmptyArr(arr) { return !(Array.isArray(arr) && arr.length === 0); } /** * isSalePresent * Function designed to check through the digitalData object for the presence of all the * possible sale indicators * @param {Record} ddo - the digitalData object on the window * @returns {string} - if defined * @returns {null} - if undefined */ function isSalePresent(ddo) { var saleIndicators = whichDomain() === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA ? _widget_constants__WEBPACK_IMPORTED_MODULE_0__.BOFA_SALE_INDICATORS : _widget_constants__WEBPACK_IMPORTED_MODULE_0__.ML_SALE_INDICATORS; for (var i = 0; i < saleIndicators.length; i++) { if (ddo[saleIndicators[i]] && ddo[saleIndicators[i]] !== null && ddo[saleIndicators[i]] !== "") { return ddo[saleIndicators[i]]; } } return null; } /** * proxyChatDDO * Function designed to set mutation observer on DDO * @param {object} obj - ddo object to be observing * @param {string} key - key value that is listened for * @return {bool} */ function proxyChatDDO(obj, key) { var oldValue = obj[key]; Object.defineProperty(obj, key, { get: function () { return oldValue; }, set: function (newValue) { logGenesysEvent(2, "Bactm Proxy DDO Change", "newValue: ".concat(newValue)); oldValue = newValue; // eslint-disable-next-line no-param-reassign if (key === "applicationID") key = _widget_constants__WEBPACK_IMPORTED_MODULE_0__.INQ_CLIENT_ORDER_NUM; (0,_pubsub_post_messages__WEBPACK_IMPORTED_MODULE_1__.sendProxyPostMessage)(key, newValue); }, }); } /** * increaseErrorCount * Function designed to count every time that an error occurs. Once 3 errors occur, * publish will occur to shutdown chat on widget and site */ function increaseErrorCount() { if (bactm && bactm.ddo) { var errorCount = bactm.ddo.get("page.attributes.chat.genesys_error_count") || 0; errorCount++; bactm.ddo.set("page.attributes.chat.genesys_error_count", errorCount); if (errorCount === _widget_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_ERR_RETRIES) TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.CANCEL_SITE_SUBS); } } /** * getHostName * Extracts hostname from URL String * @param {string} url to extract hostname * @returns {string} hostname */ function getHostName(url) { var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i); if (match != null && match.length > 2 && typeof match[2] === "string" && match[2].length > 0) { return match[2]; } return null; } /** * getTopLevelDomain * Extract TLD from URL string * @param {string} url to extract tld * @returns {string} top level domain */ function getTopLevelDomain(url) { var merrillTLDs = [ // goes from most specific to least specific "merrilledgesit1.com", "merrilledgesit2.com", "fssit1.ml.com", "fssit2.ml.com", "benefitssit1.ml.com", "benefitssit2.ml.com", "ml.com", "merrilledge.com", ]; if (url.includes("bankofamerica.com") || url.includes("localhost")) return "bankofamerica.com"; return merrillTLDs.filter(function (tld) { return url.includes(tld); })[0]; } /** * getCurrentDomain * Obtains the current TLD domain from current window.location.href * @returns {string} Current TLD */ function getCurrentDomain() { if (window.location.origin === "http://localhost:4000") { return "localhost"; } return getTopLevelDomain(window.location.origin); } /** * Publish to window * @param {string} eventName - name on event * @param {object} payload - Events payload * @returns {boolean} */ function publishWindow(eventName, payload) { window.sparta.chat.widgetLoader.pub(eventName, payload); return false; } /** * Publish to Tealium * @param {string} eventName - name on event * @param {object} payload - Events payload * @returns {boolean} */ function publishTealium(eventName, payload) { TealiumPubSub.publish(eventName, payload); return false; } /** * Determine Chat Environment * @returns {boolean} */ function determineChatEnv() { if (window.bactm_envSelector) return; if (window.nucleus) { window.bactm_envSelector = window.nucleus.state().toJS().cms .environmentVariables.isProd ? "prod" : "notprod"; } else { window.bactm_envSelector = "notprod"; } } /** * Log Genesys Event * @param {eventName} - Name of the genesys event * @param {info} - Other information that needs to be collected * @returns {void} */ function logGenesysEvent(levelNum, eventName, data) { if (window.bactm_envSelector === "prod") return; if (!window.bactm) { window.bactm = {}; window.bactm.chat_dataCollector = []; } var levelNumEvents = { 1: "info", 2: "warn", 3: "error", }; var level = levelNumEvents[levelNum]; var newEvent = { eventName: eventName, data: data, }; var debugChat = queryStringParse("debugChat"); if (debugChat === "1") { // eslint-disable-next-line no-console console.groupCollapsed("Bactm Genesys Chat - ".concat(eventName)); // eslint-disable-next-line no-console console.info({ data: data, level: level }); // eslint-disable-next-line no-console console.groupEnd(); } window.bactm.chat_dataCollector.push({ level: level, newEvent: newEvent }); } // /** // * checkIfNative // * Checks querystring for nativeChat flag // * @returns {string} // */ // export const checkIfNativeChat = (parentWindow = window.parent) => { // const urlParams = new URLSearchParams(parentWindow.location.search); // const bactmCookies = new bactm.Cookies() // const checkCookie = bactmCookies.get('occtChat'); // const occtChatCookie = checkCookie ? JSON.parse(checkCookie) : ""; // return urlParams.get("nativeChat") === null // ? (occtChatCookie.nativeChat // ? occtChatCookie.nativeChat // : "") // : urlParams.get("nativeChat").toLowerCase() // }; // /** // * checkChatID // * Checks querystring for chatID flag // * @returns {string} // */ // export const checkChatID = (parentWindow = window.parent) => { // const urlParams = new URLSearchParams(parentWindow.location.search); // const bactmCookies = new bactm.Cookies() // const checkCookie = bactmCookies.get('occtChat'); // const occtChatCookie = checkCookie ? JSON.parse(checkCookie) : ""; // return urlParams.get('chatID') === null // ? (occtChatCookie.chatID // ? occtChatCookie.chatID // : '') // : urlParams.get('chatID'); // }; var checkWrap = function (parentWindow) { if (parentWindow === void 0) { parentWindow = window.parent; } return window.location.href.includes("wrap=MDA") ? "Y" : "N"; }; /** * getGSID * @returns null || string */ function getGSID() { var gsid = (0,_get_cookie__WEBPACK_IMPORTED_MODULE_2__["default"])(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.COOKIE_GSID); if (isEmptyObj(gsid)) { return ""; } return gsid; } /** * sets refid cookie for testing * @returns void */ function mockRefID() { var _a, _b; if (window.bactm_envSelector === "notprod") { var mockRefID_1 = (_b = (_a = new bactm.QueryString(window.location.href)) === null || _a === void 0 ? void 0 : _a._cache) === null || _b === void 0 ? void 0 : _b.mockRefID; if (mockRefID_1) { (0,_set_cookie__WEBPACK_IMPORTED_MODULE_3__["default"])({ mockRefID: mockRefID_1 }, { NAME: "mockRefID", EXPIRATION: 10, DOMAIN: ".bankofamerica.com", SECURE: true, PATH: "/", }); } } } function qsLobSetter() { var sbIndicators = ["customer_lob=sbob", "sbflow=y", "subChannel=SBCLO"]; var consumerIndicators = ["customer_lob=co"]; var gwimUstrustIndicators = []; var isSBPage = false; var bactmCookies = new bactm.Cookies(); var sbCookie = bactmCookies.get("isSBCustomer"); if (window.location.href.includes("/secure-authsales-eclo/eclo-results-auth/")) { isSBPage = sbCookie == "true" ? true : false; } var smBusIndicatorsFound = sbIndicators.filter(function (indicator) { return window.location.search.includes(indicator); }); var isSmallBusiness = smBusIndicatorsFound.length > 0; if (isSmallBusiness || isSBPage) { digitalData.page.attributes.chat.customer_lob = "sbob"; } } /** * Is Universal Header * * * @returns {boolean} */ function isUniversalHeader() { var $universalHeaderModule = document.getElementById("universalHeaderModule"); return document.body.contains($universalHeaderModule); } /***/ }), /***/ "./src/widget/widget-api/agent-incentive.ts": /*!**************************************************!*\ !*** ./src/widget/widget-api/agent-incentive.ts ***! \**************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ genesysAgentQualifiedLead; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module widget-api/agent-incentive */ /** * Genesys Qualified Lead * @param {string} agentID - encrypted NBKID for the agent * @desc - Genesys sends an encrypted NBKID once the chat has made a qualified lead. * This function stores the encrypted ID as a cookie so it can be collected by ABPA once a sale * has occurred * */ function genesysAgentQualifiedLead(eventName, _a) { var agentID = _a.agentID; (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, _widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_QUALIFIED_LEAD, { agentID: agentID }); try { var agentLTS = bactm.Store('chat', { type: 'cookie' }); if ((0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isMerrill)()) { agentLTS.clear(); } // this sets bactm_lts cookie certain sales flow check the bactm_lts cookie rather than the occtChat_lts cookie agentLTS.set('secureAgentID', agentID); agentLTS.save(); digitalData.page.attributes.chat.agent_id = agentLTS.get('secureAgentID'); digitalData.page.attributes.chat.sale_occurred = false; } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Agent Qualified Lead Error', e); if (bactm && bactm.plugins && bactm.plugins.pixelTag) bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); } } /***/ }), /***/ "./src/widget/widget-api/co-browse.ts": /*!********************************************!*\ !*** ./src/widget/widget-api/co-browse.ts ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /* eslint-disable */ /** @module widget-api/co-browse */ /** * Co browse * @param {string} eventName - name of event * @param {object} configuration * TODO http://localhost:4000/sparta-demo/chat-widget-demo/undefinedjs/gcb.min.js undefined is envCobrowseURL * TODO Cobrowse configuration incorrect */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, configuration) { try { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Genesys Cobrowse Configuration', configuration); (function (d, s, id, o) { var _a; var fs = d.getElementsByTagName(s)[0]; var e; if (d.getElementById(id)) return; e = d.createElement(s); e.id = id; e.src = o.src; e.setAttribute('data-gcb-url', o.cbUrl); (_a = fs.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(e, fs); }(document, 'script', 'genesys-js', { src: "".concat(configuration.envCobrowseURL, "js/gcb.min.js"), cbUrl: configuration.envCobrowseURL })); window._genesys = configuration; TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_COBROWSE_CONFIGURED, configuration); } catch (e) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Cobrowse Error', e); if (bactm && bactm.plugins && bactm.plugins.pixelTag) bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(e)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); } } /***/ }), /***/ "./src/widget/widget-api/configure-cobrowse.ts": /*!*****************************************************!*\ !*** ./src/widget/widget-api/configure-cobrowse.ts ***! \*****************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ handleConfigureCobrowse; } /* harmony export */ }); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); var __assign = (undefined && undefined.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; // @ts-nocheck /** @module widget-api/configure-cobrowse */ /** * Handle cobrowse * @param {object} payload * @returns {boolean} */ function handleConfigureCobrowse(payload) { var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.isV6)(); var whichChat = v6 ? 'gt-chat-widget' : 'www-chat'; var widgetVersion = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.whichVersion)(); var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.getCurrentDomain)(); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_0__.publishTealium)(_widget_constants__WEBPACK_IMPORTED_MODULE_1__.GENESYS_COBROWSE_CONFIGURATION, __assign(__assign({}, payload.detail), { // eslint-disable-next-line max-len envCobrowseURL: spaWidgetParams[whichChat][widgetVersion].siteParams.domains[currentTLD].cobrowse })); return false; } /***/ }), /***/ "./src/widget/widget-api/send-disposition-code.ts": /*!********************************************************!*\ !*** ./src/widget/widget-api/send-disposition-code.ts ***! \********************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }, /* harmony export */ failureSendDispositionCode: function() { return /* binding */ failureSendDispositionCode; } /* harmony export */ }); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../widget-constants */ "./src/widget/widget-constants.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utilities/utilities */ "./src/widget/utilities/utilities.ts"); // @ts-nocheck /** @module widget-api/send-disposition-code */ /** * GWE Chat Disposition Response - Failure * @desc Upon failure, function delivers a Pub/Sub event to send error information back to UI * @returns {undefined} */ function failureSendDispositionCode(dispositionResponse) { TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GWE_SEND_DISPOSITION_CODE_FAILURE, dispositionResponse); if (bactm && bactm.plugins && bactm.plugins.pixelTag) bactm.plugins.pixelTag.firePixelTag("".concat(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.PIXEL_TAG_URL, "?error=").concat(dispositionResponse)); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Survey Response Failure', dispositionResponse); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.increaseErrorCount)(); return false; } /** * GWE Chat Disposition Response * @param {string} eventName * @param {object} payload * @desc The following method will send the customer response to a proactive chat request * @returns {undefined} */ /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(eventName, payload) { try { var result = payload.result, engagementID = payload.engagementID, pageID = payload.pageID, visitID = payload.visitID; var widgetVersion = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.whichVersion)(); var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.isV6)(); var whichChat = v6 ? 'gt-chat-widget' : 'www-chat'; var currentTLD = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.getCurrentDomain)(); // eslint-disable-next-line max-len var inviteURL = spaWidgetParams[whichChat][widgetVersion].siteParams.domains[currentTLD].monitoringjs; var sendDispositionUrl = "".concat(inviteURL, "/server/data/invites/?result=").concat(result, "&engagementID=").concat(engagementID, "&pageID=").concat(pageID, "&visitID=").concat(visitID); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(1, 'Chat Disposition Code', payload); fetch(sendDispositionUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', }, credentials: 'include', }); TealiumPubSub.publish(_widget_constants__WEBPACK_IMPORTED_MODULE_0__.GENESYS_SUSPEND_MONITORING); } catch (error) { (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_1__.logGenesysEvent)(3, 'Genesys Survey Error', error); failureSendDispositionCode(error); } } /***/ }), /***/ "./src/widget/widget-constants.ts": /*!****************************************!*\ !*** ./src/widget/widget-constants.ts ***! \****************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ACS_LOGGER_PUBLIC_URL: function() { return /* binding */ ACS_LOGGER_PUBLIC_URL; }, /* harmony export */ ACS_LOGGER_URL: function() { return /* binding */ ACS_LOGGER_URL; }, /* harmony export */ BOFA: function() { return /* binding */ BOFA; }, /* harmony export */ BOFA_DOMAINS: function() { return /* binding */ BOFA_DOMAINS; }, /* harmony export */ BOFA_SALE_INDICATORS: function() { return /* binding */ BOFA_SALE_INDICATORS; }, /* harmony export */ CANCEL_HEARTBEAT: function() { return /* binding */ CANCEL_HEARTBEAT; }, /* harmony export */ CANCEL_SITE_SUBS: function() { return /* binding */ CANCEL_SITE_SUBS; }, /* harmony export */ CANCEL_WIDGET_SUBS: function() { return /* binding */ CANCEL_WIDGET_SUBS; }, /* harmony export */ CHAT_INITIALIZATION: function() { return /* binding */ CHAT_INITIALIZATION; }, /* harmony export */ CHECK_AH_TOKEN: function() { return /* binding */ CHECK_AH_TOKEN; }, /* harmony export */ CHECK_FOR_SALE: function() { return /* binding */ CHECK_FOR_SALE; }, /* harmony export */ COMETD_META_DISCONNECT: function() { return /* binding */ COMETD_META_DISCONNECT; }, /* harmony export */ COOKIE: function() { return /* binding */ COOKIE; }, /* harmony export */ COOKIE_GSID: function() { return /* binding */ COOKIE_GSID; }, /* harmony export */ GENESYS_CHECK_FOR_SALE: function() { return /* binding */ GENESYS_CHECK_FOR_SALE; }, /* harmony export */ GENESYS_COBROWSE_CONFIGURATION: function() { return /* binding */ GENESYS_COBROWSE_CONFIGURATION; }, /* harmony export */ GENESYS_COBROWSE_CONFIGURED: function() { return /* binding */ GENESYS_COBROWSE_CONFIGURED; }, /* harmony export */ GENESYS_FETCH_SESSION_ENDPOINT: function() { return /* binding */ GENESYS_FETCH_SESSION_ENDPOINT; }, /* harmony export */ GENESYS_QUALIFIED_LEAD: function() { return /* binding */ GENESYS_QUALIFIED_LEAD; }, /* harmony export */ GENESYS_REQUEST_FETCH_SESSION: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION; }, /* harmony export */ GENESYS_REQUEST_FETCH_SESSION_FAILURE: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION_FAILURE; }, /* harmony export */ GENESYS_REQUEST_FETCH_SESSION_SUCCESS: function() { return /* binding */ GENESYS_REQUEST_FETCH_SESSION_SUCCESS; }, /* harmony export */ GENESYS_REQUEST_NATIVE_CHAT: function() { return /* binding */ GENESYS_REQUEST_NATIVE_CHAT; }, /* harmony export */ GENESYS_REQUEST_TC_UPDATE: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE; }, /* harmony export */ GENESYS_REQUEST_TC_UPDATE_FAILURE: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE_FAILURE; }, /* harmony export */ GENESYS_REQUEST_TC_UPDATE_SUCCESS: function() { return /* binding */ GENESYS_REQUEST_TC_UPDATE_SUCCESS; }, /* harmony export */ GENESYS_SET_AGENT_ID: function() { return /* binding */ GENESYS_SET_AGENT_ID; }, /* harmony export */ GENESYS_SUSPEND_MONITORING: function() { return /* binding */ GENESYS_SUSPEND_MONITORING; }, /* harmony export */ GENESYS_UPDATE_CHAT_DATA_ENDPOINT: function() { return /* binding */ GENESYS_UPDATE_CHAT_DATA_ENDPOINT; }, /* harmony export */ GENESYS_VALIDATE_IP_ADDRESS_SUCCESS: function() { return /* binding */ GENESYS_VALIDATE_IP_ADDRESS_SUCCESS; }, /* harmony export */ GRAB_HEARTBEAT_DATA: function() { return /* binding */ GRAB_HEARTBEAT_DATA; }, /* harmony export */ GWE_SEND_DISPOSITION_CODE: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE; }, /* harmony export */ GWE_SEND_DISPOSITION_CODE_FAILURE: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE_FAILURE; }, /* harmony export */ GWE_SEND_DISPOSITION_CODE_SUCCESS: function() { return /* binding */ GWE_SEND_DISPOSITION_CODE_SUCCESS; }, /* harmony export */ INIT_CHAT: function() { return /* binding */ INIT_CHAT; }, /* harmony export */ INQ_CLIENT_ORDER_NUM: function() { return /* binding */ INQ_CLIENT_ORDER_NUM; }, /* harmony export */ INTERNAL: function() { return /* binding */ INTERNAL; }, /* harmony export */ IR_ENV: function() { return /* binding */ IR_ENV; }, /* harmony export */ MAX_ERR_RETRIES: function() { return /* binding */ MAX_ERR_RETRIES; }, /* harmony export */ MERRILL: function() { return /* binding */ MERRILL; }, /* harmony export */ ML_SALE_INDICATORS: function() { return /* binding */ ML_SALE_INDICATORS; }, /* harmony export */ MONITORINGJS_HEARTBEAT: function() { return /* binding */ MONITORINGJS_HEARTBEAT; }, /* harmony export */ MONITORINGJS_HEARTBEAT_FAILURE: function() { return /* binding */ MONITORINGJS_HEARTBEAT_FAILURE; }, /* harmony export */ MONITORINGJS_REQUEST: function() { return /* binding */ MONITORINGJS_REQUEST; }, /* harmony export */ MONITORINGJS_RESPONSE: function() { return /* binding */ MONITORINGJS_RESPONSE; }, /* harmony export */ MONITORINGJS_RESPONSE_FAILURE: function() { return /* binding */ MONITORINGJS_RESPONSE_FAILURE; }, /* harmony export */ MONITORING_CLEAR_HEARTBEAT: function() { return /* binding */ MONITORING_CLEAR_HEARTBEAT; }, /* harmony export */ MONITORING_ID_RESPONSE: function() { return /* binding */ MONITORING_ID_RESPONSE; }, /* harmony export */ PIXEL_TAG_URL: function() { return /* binding */ PIXEL_TAG_URL; }, /* harmony export */ PM_SEND_SALE_OCCURRED: function() { return /* binding */ PM_SEND_SALE_OCCURRED; }, /* harmony export */ SEND_PROXY_DATA: function() { return /* binding */ SEND_PROXY_DATA; }, /* harmony export */ SET_MONITORING_STATUS: function() { return /* binding */ SET_MONITORING_STATUS; }, /* harmony export */ SITE_INFO_AVAILABLE: function() { return /* binding */ SITE_INFO_AVAILABLE; }, /* harmony export */ SPARTA: function() { return /* binding */ SPARTA; }, /* harmony export */ SPARTA_WIDGET_READY: function() { return /* binding */ SPARTA_WIDGET_READY; }, /* harmony export */ TEALIUM_READY_FOR_PUBSUB: function() { return /* binding */ TEALIUM_READY_FOR_PUBSUB; }, /* harmony export */ WIDGET_REQUEST_CONFIGURATION: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION; }, /* harmony export */ WIDGET_REQUEST_CONFIGURATION_ERROR: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION_ERROR; }, /* harmony export */ WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL: function() { return /* binding */ WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL; }, /* harmony export */ chatSiteParams: function() { return /* binding */ chatSiteParams; }, /* harmony export */ errorLoadingWidget: function() { return /* binding */ errorLoadingWidget; }, /* harmony export */ spartaLoaderLoaded: function() { return /* binding */ spartaLoaderLoaded; } /* harmony export */ }); // @ts-nocheck /** @module base/widget-constants */ /** * Widget constants * @type {string} */ var MONITORINGJS_REQUEST = 'MONITORINGJS_REQUEST'; var MONITORINGJS_HEARTBEAT = 'MONITORINGJS_HEARTBEAT'; var MONITORING_CLEAR_HEARTBEAT = 'MONITORING_CLEAR_HEARTBEAT'; var COMETD_META_DISCONNECT = 'COMETD_META_DISCONNECT'; var PM_SEND_SALE_OCCURRED = 'PM_SEND_SALE_OCCURRED'; var GENESYS_CHECK_FOR_SALE = 'GENESYS_CHECK_FOR_SALE'; var GENESYS_QUALIFIED_LEAD = 'GENESYS_QUALIFIED_LEAD'; /** * Genesys configurations & request constants * @type {string} */ var GENESYS_COBROWSE_CONFIGURED = 'GENESYS_COBROWSE_CONFIGURED'; var GENESYS_COBROWSE_CONFIGURATION = 'GENESYS_COBROWSE_CONFIGURATION'; /** * GWE send disposition request, success, & failure constants * @type {string} */ var GWE_SEND_DISPOSITION_CODE = 'GWE_SEND_DISPOSITION_CODE'; var GWE_SEND_DISPOSITION_CODE_SUCCESS = 'GWE_SEND_DISPOSITION_CODE_SUCCESS'; var GWE_SEND_DISPOSITION_CODE_FAILURE = 'GWE_SEND_DISPOSITION_CODE_FAILURE'; /** * Post Message Constants * @type {string} */ var CANCEL_HEARTBEAT = 'CANCEL_HEARTBEAT'; var CANCEL_WIDGET_SUBS = 'CANCEL_WIDGET_SUBS'; var CANCEL_SITE_SUBS = 'CANCEL_SITE_SUBS'; var CHECK_AH_TOKEN = 'CHECK_AH_TOKEN'; var CHECK_FOR_SALE = 'CHECK_FOR_SALE'; var GRAB_HEARTBEAT_DATA = 'GRAB_HEARTBEAT_DATA'; var SET_MONITORING_STATUS = 'SET_MONITORING_STATUS'; var SEND_PROXY_DATA = 'SEND_PROXY_DATA'; var MAX_ERR_RETRIES = 3; /** * response failures constants * @type {string} */ var MONITORINGJS_RESPONSE_FAILURE = 'MONITORINGJS_RESPONSE_FAILURE'; var MONITORINGJS_HEARTBEAT_FAILURE = 'MONITORINGJS_HEARTBEAT_FAILURE'; /** * response success constants * @type {string} */ var MONITORINGJS_RESPONSE = 'MONITORINGJS_RESPONSE'; var MONITORING_ID_RESPONSE = 'MONITORING_ID_RESPONSE'; /** * chat & widget constants * @type {string} */ var spartaLoaderLoaded = 'spartaLoaderLoaded'; var errorLoadingWidget = 'errorLoadingWidget'; var CHAT_INITIALIZATION = 'CHAT_INITIALIZATION'; var WIDGET_REQUEST_CONFIGURATION = 'WIDGET_REQUEST_CONFIGURATION'; var SPARTA_WIDGET_READY = 'SPARTA_WIDGET_READY.spartaWidgetUtility'; var WIDGET_REQUEST_CONFIGURATION_ERROR = 'WIDGET_REQUEST_CONFIGURATION_ERROR'; var WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL = 'WIDGET_REQUEST_CONFIGURATION_SUCCESSFUL'; /** * genesys fetch session constants * this is specific to chat ACS and will only be used inside mweb * @type {string} */ var GENESYS_REQUEST_FETCH_SESSION = 'GENESYS_REQUEST_FETCH_SESSION'; var GENESYS_REQUEST_FETCH_SESSION_SUCCESS = 'GENESYS_REQUEST_FETCH_SESSION_SUCCESS'; var GENESYS_REQUEST_FETCH_SESSION_FAILURE = 'GENESYS_REQUEST_FETCH_SESSION_FAILURE'; var GENESYS_UPDATE_CHAT_DATA_ENDPOINT = '1/service/UpdateChatData'; var GENESYS_FETCH_SESSION_ENDPOINT = '1/service/GetRefIDInfo/'; var SITE_INFO_AVAILABLE = 'SITE_INFO_AVAILABLE'; var TEALIUM_READY_FOR_PUBSUB = 'TEALIUM_READY_FOR_PUBSUB'; /** * genesys native chat event * @type {string} */ var GENESYS_REQUEST_NATIVE_CHAT = 'GENESYS_REQUEST_NATIVE_CHAT'; var GENESYS_VALIDATE_IP_ADDRESS_SUCCESS = 'GENESYS_VALIDATE_IP_ADDRESS_SUCCESS'; var GENESYS_SET_AGENT_ID = 'GENESYS_SET_AGENT_ID'; /** * genesys request terms and conditions update event * @type {string} */ var GENESYS_REQUEST_TC_UPDATE = 'GENESYS_REQUEST_TC_UPDATE'; var GENESYS_REQUEST_TC_UPDATE_SUCCESS = 'GENESYS_REQUEST_TC_UPDATE_SUCCESS'; var GENESYS_REQUEST_TC_UPDATE_FAILURE = 'GENESYS_REQUEST_TC_UPDATE_FAILURE'; var chatSiteParams = { spaParams: undefined }; /** * Pixel Tag URL for Error Logging * @type {string} */ var PIXEL_TAG_URL = 'https://www.bankofamerica.com/pa/global-assets/1.0/graphic/clr.gif'; /** * Mobile ACS Logger Service * @type {string} */ var ACS_LOGGER_URL = '/mgateway/v1/clientLogger/log'; var ACS_LOGGER_PUBLIC_URL = '/mgateway/public/v1/clientLogger/log'; /** * Init Chat Constant * @type {string} */ var INIT_CHAT = 'INIT_CHAT'; /** * Suspend Heartbeat Constant * @type {string} */ var GENESYS_SUSPEND_MONITORING = 'GENESYS_SUSPEND_MONITORING'; /** * Release and Environmental Constants * @type {array} * @type {string} */ var MERRILL = 'MERRILL'; var INTERNAL = 'INTERNAL'; var BOFA = 'BOFA'; var SPARTA = 'SPARTA'; var BOFA_DOMAINS = [ 'dev1.', 'dev2.,', 'dev3.', 'dev4.', 'devflex.', 'devps.', 'qa5.', 'qaps.', 'cert1.', 'cert2.', 'pt1.', 'pt2.', 'preview1.', 'preview2.', 'review1.', 'review2.', 'dev1-helix.', 'dev2-helix.', 'dev3-helix.', 'dev4-helix.', 'devflex1-helix.', 'pt1-helix.', 'pt2-helix.', 'pssit-helix.', 'preview1-helix.', 'preview2-helix.', 'review1-helix.', 'review2-helix.', 'sit1a-helix.', 'sit2a-helix.', 'sit3-helix.', 'sitbc-helix.', ]; var IR_ENV = { DEV: 'dev4', CERT: 'sit1a', }; /** * Sale Indicators Constants Array * @type {array} */ var ML_SALE_INDICATORS = [ 'inqClientOrderNum', 'MLD_OAO_CONFIRMATIONNUMBER', 'MLD_OAO_ACCOUNTNUMBER', ]; var BOFA_SALE_INDICATORS = [ 'applicationID', ]; var INQ_CLIENT_ORDER_NUM = 'inqClientOrderNum'; var COOKIE = { NAME: 'occtChat', EXPIRATION: 10, DOMAIN: '.bankofamerica.com', SECURE: true, PATH: '/', }; /** * GSID Cookie */ var COOKIE_GSID = { NAME: 'GSID', DOMAIN: '.bankofamerica.com', SECURE: true, PATH: '/', }; /***/ }), /***/ "./node_modules/whatwg-fetch/fetch.js": /*!********************************************!*\ !*** ./node_modules/whatwg-fetch/fetch.js ***! \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DOMException: function() { return /* binding */ DOMException; }, /* harmony export */ Headers: function() { return /* binding */ Headers; }, /* harmony export */ Request: function() { return /* binding */ Request; }, /* harmony export */ Response: function() { return /* binding */ Response; }, /* harmony export */ fetch: function() { return /* binding */ fetch; } /* harmony export */ }); /* eslint-disable no-prototype-builtins */ var g = (typeof globalThis !== 'undefined' && globalThis) || (typeof self !== 'undefined' && self) || // eslint-disable-next-line no-undef (typeof __webpack_require__.g !== 'undefined' && __webpack_require__.g) || {} var support = { searchParams: 'URLSearchParams' in g, iterable: 'Symbol' in g && 'iterator' in Symbol, blob: 'FileReader' in g && 'Blob' in g && (function() { try { new Blob() return true } catch (e) { return false } })(), formData: 'FormData' in g, arrayBuffer: 'ArrayBuffer' in g } function isDataView(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ] var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 } } function normalizeName(name) { if (typeof name !== 'string') { name = String(name) } if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') { throw new TypeError('Invalid character in header field name: "' + name + '"') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value) } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift() return {done: value === undefined, value: value} } } if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator } } return iterator } function Headers(headers) { this.map = {} if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value) }, this) } else if (Array.isArray(headers)) { headers.forEach(function(header) { if (header.length != 2) { throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length) } this.append(header[0], header[1]) }, this) } else if (headers) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]) }, this) } } Headers.prototype.append = function(name, value) { name = normalizeName(name) value = normalizeValue(value) var oldValue = this.map[name] this.map[name] = oldValue ? oldValue + ', ' + value : value } Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)] } Headers.prototype.get = function(name) { name = normalizeName(name) return this.has(name) ? this.map[name] : null } Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) } Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value) } Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this) } } } Headers.prototype.keys = function() { var items = [] this.forEach(function(value, name) { items.push(name) }) return iteratorFor(items) } Headers.prototype.values = function() { var items = [] this.forEach(function(value) { items.push(value) }) return iteratorFor(items) } Headers.prototype.entries = function() { var items = [] this.forEach(function(value, name) { items.push([name, value]) }) return iteratorFor(items) } if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries } function consumed(body) { if (body._noBody) return if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result) } reader.onerror = function() { reject(reader.error) } }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) reader.readAsArrayBuffer(blob) return promise } function readBlobAsText(blob) { var reader = new FileReader() var promise = fileReaderReady(reader) var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type) var encoding = match ? match[1] : 'utf-8' reader.readAsText(blob, encoding) return promise } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf) var chars = new Array(view.length) for (var i = 0; i < view.length; i++) { chars[i] = String.fromCharCode(view[i]) } return chars.join('') } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength) view.set(new Uint8Array(buf)) return view.buffer } } function Body() { this.bodyUsed = false this._initBody = function(body) { /* fetch-mock wraps the Response object in an ES6 Proxy to provide useful test harness features such as flush. However, on ES5 browsers without fetch or Proxy support pollyfills must be used; the proxy-pollyfill is unable to proxy an attribute unless it exists on the object before the Proxy is created. This change ensures Response.bodyUsed exists on the instance, while maintaining the semantic of setting Request.bodyUsed in the constructor before _initBody is called. */ // eslint-disable-next-line no-self-assign this.bodyUsed = this.bodyUsed this._bodyInit = body if (!body) { this._noBody = true; this._bodyText = '' } else if (typeof body === 'string') { this._bodyText = body } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString() } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer) // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]) } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body) } else { this._bodyText = body = Object.prototype.toString.call(body) } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8') } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type) } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') } } } if (support.blob) { this.blob = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } } } this.arrayBuffer = function() { if (this._bodyArrayBuffer) { var isConsumed = consumed(this) if (isConsumed) { return isConsumed } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) { return Promise.resolve( this._bodyArrayBuffer.buffer.slice( this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength ) ) } else { return Promise.resolve(this._bodyArrayBuffer) } } else if (support.blob) { return this.blob().then(readBlobAsArrayBuffer) } else { throw new Error('could not read as ArrayBuffer') } } this.text = function() { var rejected = consumed(this) if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } } if (support.formData) { this.formData = function() { return this.text().then(decode) } } this.json = function() { return this.text().then(JSON.parse) } return this } // HTTP methods whose capitalization should be normalized var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'] function normalizeMethod(method) { var upcased = method.toUpperCase() return methods.indexOf(upcased) > -1 ? upcased : method } function Request(input, options) { if (!(this instanceof Request)) { throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') } options = options || {} var body = options.body if (input instanceof Request) { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url this.credentials = input.credentials if (!options.headers) { this.headers = new Headers(input.headers) } this.method = input.method this.mode = input.mode this.signal = input.signal if (!body && input._bodyInit != null) { body = input._bodyInit input.bodyUsed = true } } else { this.url = String(input) } this.credentials = options.credentials || this.credentials || 'same-origin' if (options.headers || !this.headers) { this.headers = new Headers(options.headers) } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null this.signal = options.signal || this.signal || (function () { if ('AbortController' in g) { var ctrl = new AbortController(); return ctrl.signal; } }()); this.referrer = null if ((this.method === 'GET' || this.method === 'HEAD') && body) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body) if (this.method === 'GET' || this.method === 'HEAD') { if (options.cache === 'no-store' || options.cache === 'no-cache') { // Search for a '_' parameter in the query string var reParamSearch = /([?&])_=[^&]*/ if (reParamSearch.test(this.url)) { // If it already exists then set the value with the current time this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime()) } else { // Otherwise add a new '_' parameter to the end with the current time var reQueryString = /\?/ this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime() } } } } Request.prototype.clone = function() { return new Request(this, {body: this._bodyInit}) } function decode(body) { var form = new FormData() body .trim() .split('&') .forEach(function(bytes) { if (bytes) { var split = bytes.split('=') var name = split.shift().replace(/\+/g, ' ') var value = split.join('=').replace(/\+/g, ' ') form.append(decodeURIComponent(name), decodeURIComponent(value)) } }) return form } function parseHeaders(rawHeaders) { var headers = new Headers() // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ') // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill // https://github.com/github/fetch/issues/748 // https://github.com/zloirock/core-js/issues/751 preProcessedHeaders .split('\r') .map(function(header) { return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header }) .forEach(function(line) { var parts = line.split(':') var key = parts.shift().trim() if (key) { var value = parts.join(':').trim() try { headers.append(key, value) } catch (error) { console.warn('Response ' + error.message) } } }) return headers } Body.call(Request.prototype) function Response(bodyInit, options) { if (!(this instanceof Response)) { throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') } if (!options) { options = {} } this.type = 'default' this.status = options.status === undefined ? 200 : options.status if (this.status < 200 || this.status > 599) { throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].") } this.ok = this.status >= 200 && this.status < 300 this.statusText = options.statusText === undefined ? '' : '' + options.statusText this.headers = new Headers(options.headers) this.url = options.url || '' this._initBody(bodyInit) } Body.call(Response.prototype) Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) } Response.error = function() { var response = new Response(null, {status: 200, statusText: ''}) response.ok = false response.status = 0 response.type = 'error' return response } var redirectStatuses = [301, 302, 303, 307, 308] Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) } var DOMException = g.DOMException try { new DOMException() } catch (err) { DOMException = function(message, name) { this.message = message this.name = name var error = Error(message) this.stack = error.stack } DOMException.prototype = Object.create(Error.prototype) DOMException.prototype.constructor = DOMException } function fetch(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init) if (request.signal && request.signal.aborted) { return reject(new DOMException('Aborted', 'AbortError')) } var xhr = new XMLHttpRequest() function abortXhr() { xhr.abort() } xhr.onload = function() { var options = { statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') } // This check if specifically for when a user fetches a file locally from the file system // Only if the status is out of a normal range if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) { options.status = 200; } else { options.status = xhr.status; } options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') var body = 'response' in xhr ? xhr.response : xhr.responseText setTimeout(function() { resolve(new Response(body, options)) }, 0) } xhr.onerror = function() { setTimeout(function() { reject(new TypeError('Network request failed')) }, 0) } xhr.ontimeout = function() { setTimeout(function() { reject(new TypeError('Network request timed out')) }, 0) } xhr.onabort = function() { setTimeout(function() { reject(new DOMException('Aborted', 'AbortError')) }, 0) } function fixUrl(url) { try { return url === '' && g.location.href ? g.location.href : url } catch (e) { return url } } xhr.open(request.method, fixUrl(request.url), true) if (request.credentials === 'include') { xhr.withCredentials = true } else if (request.credentials === 'omit') { xhr.withCredentials = false } if ('responseType' in xhr) { if (support.blob) { xhr.responseType = 'blob' } else if ( support.arrayBuffer ) { xhr.responseType = 'arraybuffer' } } if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) { var names = []; Object.getOwnPropertyNames(init.headers).forEach(function(name) { names.push(normalizeName(name)) xhr.setRequestHeader(name, normalizeValue(init.headers[name])) }) request.headers.forEach(function(value, name) { if (names.indexOf(name) === -1) { xhr.setRequestHeader(name, value) } }) } else { request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value) }) } if (request.signal) { request.signal.addEventListener('abort', abortXhr) xhr.onreadystatechange = function() { // DONE (success or failure) if (xhr.readyState === 4) { request.signal.removeEventListener('abort', abortXhr) } } } xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) }) } fetch.polyfill = true if (!g.fetch) { g.fetch = fetch g.Headers = Headers g.Request = Request g.Response = Response } /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/global */ /******/ !function() { /******/ __webpack_require__.g = (function() { /******/ if (typeof globalThis === 'object') return globalThis; /******/ try { /******/ return this || new Function('return this')(); /******/ } catch (e) { /******/ if (typeof window === 'object') return window; /******/ } /******/ })(); /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. !function() { /*!*****************************!*\ !*** ./src/widget/index.ts ***! \*****************************/ __webpack_require__.r(__webpack_exports__); /* harmony import */ var whatwg_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! whatwg-fetch */ "./node_modules/whatwg-fetch/fetch.js"); /* harmony import */ var _pubsub_bootstrap__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pubsub/bootstrap */ "./src/widget/pubsub/bootstrap.ts"); /* harmony import */ var _pubsub_post_messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pubsub/post-messages */ "./src/widget/pubsub/post-messages.ts"); /* harmony import */ var _pubsub_placeholder__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pubsub/placeholder */ "./src/widget/pubsub/placeholder.ts"); /* harmony import */ var _pubsub_widget_script__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pubsub/widget-script */ "./src/widget/pubsub/widget-script.ts"); /* harmony import */ var _sales_genesys_data__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sales/genesys-data */ "./src/widget/sales/genesys-data.ts"); /* harmony import */ var _pubsub_widget_script_loaded__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pubsub/widget-script-loaded */ "./src/widget/pubsub/widget-script-loaded.ts"); /* harmony import */ var _utilities_utilities__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utilities/utilities */ "./src/widget/utilities/utilities.ts"); /* harmony import */ var _widget_constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./widget-constants */ "./src/widget/widget-constants.ts"); //@ts-nocheck /** * Load Chat Widget * * * This function loads chat widget, but also does several other things: * * - Genesys Data is populated * - Chat Placeholder is added * - Widget Script & Polyfill added * - Mock Ref ID Use Case * - Proxy Chat DDO * - Secure Agents * @returns {void} */ var loadChatWidget = function () { (0,_sales_genesys_data__WEBPACK_IMPORTED_MODULE_5__["default"])(); (0,_pubsub_placeholder__WEBPACK_IMPORTED_MODULE_3__["default"])(); // Is V6 var v6 = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.isV6)(); (0,_pubsub_widget_script__WEBPACK_IMPORTED_MODULE_4__["default"])(); if (v6) { window.sparta.chat = {}; window.sparta.chat.widgetLoader = window.sparta.widgetLoader["6.0.9"]; window.sparta.chat.widgetLoader.sub = function (message, func) { }; window.sparta.chat.widgetLoader.pub = function (message, data) { }; } // none of this code being ran (0,_pubsub_widget_script_loaded__WEBPACK_IMPORTED_MODULE_6__["default"])(); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.mockRefID)(); (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.proxyChatDDO)(window.digitalData.page.attributes.chat, "site_id"); if (typeof bactm !== "undefined") { var agentLTS = bactm.Store("chat", { type: "cookie" }); if (agentLTS.get("secureAgentID")) { var agentID = agentLTS.get("secureAgentID"); digitalData.page.attributes.chat.agent_id = agentID; } (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.qsLobSetter)(); bactm.ddo.set("page.attributes.chat.mobileIndicator", (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.checkWrap)()); } }; /** * Authenticated Listener * * * Griffins Universal Header will dispatch event to notify * Chat if user is youth or not * @returns {void} */ var authenticatedListener = function () { document.addEventListener("digitalData.auth.ready", function () { var _a = verifyYouthProfile(), youthPropExist = _a.youthPropExist, youthProp = _a.youthProp; if (youthPropExist) { if (!youthProp) { loadChatWidget(); return; } if (youthProp) return; } }, true); }; /** * Single Page Application Listener * * * Listener for bactm.on('afterPageview') * @returns {void} */ var singlePageApplicationListener = function () { try { // Ensure bactm has the correct type or cast it to a type that includes 'on' bactm === null || bactm === void 0 ? void 0 : bactm.on("afterPageview", onBactmPageView); } catch (e) { console.log(e); } }; /** * On Bactm Page View * * * Callback for when bactm.pageview is triggered */ var onBactmPageView = function (data) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; var chatDisabled = (_b = (_a = data === null || data === void 0 ? void 0 : data.pageInfo) === null || _a === void 0 ? void 0 : _a.chat) === null || _b === void 0 ? void 0 : _b.disabled; var siteID = (_d = (_c = data === null || data === void 0 ? void 0 : data.pageInfo) === null || _c === void 0 ? void 0 : _c.chat) === null || _d === void 0 ? void 0 : _d.site_id; var servicesLivePersonEnabled = (_h = (_g = (_f = (_e = window === null || window === void 0 ? void 0 : window.digitalData) === null || _e === void 0 ? void 0 : _e.page) === null || _f === void 0 ? void 0 : _f.attributes) === null || _g === void 0 ? void 0 : _g.chat) === null || _h === void 0 ? void 0 : _h.servicesLivePersonEnabled; var bactmCookies = new bactm.Cookies(); var cookieExists = bactmCookies.get("occtChat"); var occtChatCookie = cookieExists ? JSON.parse(cookieExists) : ""; var isChatOngoing = (occtChatCookie === null || occtChatCookie === void 0 ? void 0 : occtChatCookie.secureKey) && occtChatCookie.secureKey !== ""; if (servicesLivePersonEnabled === "NO" && !isChatOngoing) return false; if (chatDisabled) setChatSite({ siteID: false }); if (siteID) setChatSite({ siteID: siteID }); (_k = (_j = window === null || window === void 0 ? void 0 : window.boa) === null || _j === void 0 ? void 0 : _j.chat) === null || _k === void 0 ? void 0 : _k.reload(); }; /** * Set Chat Site ID * * * Set SITE_ID & site_id inside of DDO * @param {boolean|string} siteID * @returns {void} */ var setChatSite = function (_a) { var _b, _c, _d; var _e = _a.siteID, siteID = _e === void 0 ? false : _e; try { var chatAttributes = window.digitalData.page.attributes.chat; chatAttributes.site_id = siteID; chatAttributes.SITE_ID = siteID; window.chatSpaReady = true; (_d = (_c = (_b = window === null || window === void 0 ? void 0 : window.sparta) === null || _b === void 0 ? void 0 : _b.chat) === null || _c === void 0 ? void 0 : _c.widgetLoader) === null || _d === void 0 ? void 0 : _d.pub("startChatSPA", { siteID: siteID }); } catch (e) { console.log(e); } }; /** * Verify Youth Profile * * * Family Banking Project - Check if youth property exist * @returns {object} */ var verifyYouthProfile = function () { var _a; var user = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.user; var youthPropExist = user === null || user === void 0 ? void 0 : user.hasOwnProperty("youth"); var youthProp = (user === null || user === void 0 ? void 0 : user.youth) === "true" || (user === null || user === void 0 ? void 0 : user.youth) === true; return { youthProp: youthProp, youthPropExist: youthPropExist }; }; /** * Start Single Page Application * * * Start a Single Page Application if isSpa is pouplated * boolean true * @returns {void} */ var startSinglePageApplication = function () { var _a, _b; var delayedChat = { fired: false }; var pageViews = Array.isArray(window === null || window === void 0 ? void 0 : window.dataCollector) ? window.dataCollector.filter(function (_a) { var event = _a.event; return event === "pageview"; }) : []; if (pageViews.length === 0) { window.addEventListener("gt.showChat.ready", function (e) { if (delayedChat.fired) return; singlePageApplicationListener(); delayedChat.fired = true; }); return; } var pageView = pageViews[pageViews.length - 1]; var payload = { pageInfo: (_b = (_a = digitalData === null || digitalData === void 0 ? void 0 : digitalData.page) === null || _a === void 0 ? void 0 : _a.pageInfo) === null || _b === void 0 ? void 0 : _b[pageView.pageInfoKey], }; onBactmPageView(payload); singlePageApplicationListener(); }; /** * Start Chat Platform * * * Beginning of Chat Platform. First line of code. * @returns {void} */ var startChatPlatform = function () { var _a, _b, _c, _d, _e, _f, _g, _h; var isAuthenticated = (0,_utilities_utilities__WEBPACK_IMPORTED_MODULE_7__.isUniversalHeader)(); var disableChat = window.digitalData && window.digitalData.disableChatOnLoad === true; if (disableChat) { TealiumPubSub.subscribe(_widget_constants__WEBPACK_IMPORTED_MODULE_8__.INIT_CHAT, function () { }); return false; } if (!isAuthenticated) { loadChatWidget(); if ((_d = (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.digitalData) === null || _a === void 0 ? void 0 : _a.page) === null || _b === void 0 ? void 0 : _b.attributes) === null || _c === void 0 ? void 0 : _c.chat) === null || _d === void 0 ? void 0 : _d.isSpa) { startSinglePageApplication(); } return false; } if ((_h = (_g = (_f = (_e = window === null || window === void 0 ? void 0 : window.digitalData) === null || _e === void 0 ? void 0 : _e.page) === null || _f === void 0 ? void 0 : _f.attributes) === null || _g === void 0 ? void 0 : _g.chat) === null || _h === void 0 ? void 0 : _h.isSpa) { loadChatWidget(); startSinglePageApplication(); return false; } var _j = verifyYouthProfile(), youthPropExist = _j.youthPropExist, youthProp = _j.youthProp; if (youthPropExist) { if (!youthProp) { loadChatWidget(); return; } if (youthProp) return; } authenticatedListener(); }; (function () { return startChatPlatform(); })(); }(); /******/ })() ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFdpZGdldC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRXFEO0FBQ1A7QUFFL0IsU0FBU0Usc0JBQXNCQSxDQUFDQyxLQUFLLEVBQUVDLEtBQUssRUFBRTtFQUMzRCxJQUFJQyxNQUFNLENBQUNDLFFBQVEsQ0FBQ0MsSUFBSSxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7SUFDM0MsSUFBSSxDQUFDSCxNQUFNLENBQUNJLGlCQUFpQixFQUFFO0lBQ2pDUiwyREFBZSxDQUFDLENBQUMsRUFBRSxxQkFBcUIsRUFBRUcsS0FBSyxDQUFDO0lBQzlDLElBQU1NLFlBQVksR0FBRztNQUNuQixTQUFTLEVBQUUsQ0FDVDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLE9BQU8sWUFBQUMsTUFBQSxDQUFZUixLQUFLLGdCQUFBUSxNQUFBLENBQWFQLEtBQUssQ0FBQ1EsT0FBTztNQUNwRCxDQUFDO0lBRUwsQ0FBQztJQUNELElBQU1DLE1BQU0sR0FBR1IsTUFBTSxDQUFDQyxRQUFRLENBQUNRLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7SUFDbkUsSUFBTUMsUUFBUSxNQUFBTCxNQUFBLENBQU1FLE1BQU0sRUFBQUYsTUFBQSxDQUFHWCw2REFBYyxDQUFFO0lBQzdDaUIsS0FBSyxDQUFDRCxRQUFRLEVBQUU7TUFDZEUsT0FBTyxFQUFFO1FBQ0hDLE1BQU0sRUFBRSxrQkFBa0I7UUFDMUIsY0FBYyxFQUFFO01BQ2xCLENBQUM7TUFDSEMsTUFBTSxFQUFFLE1BQU07TUFDZEMsSUFBSSxFQUFFQyxJQUFJLENBQUNDLFNBQVMsQ0FBQ2IsWUFBWSxDQUFDO01BQ2xDYyxXQUFXLEVBQUU7SUFDZixDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFVBQVNDLEdBQUcsRUFBRTtNQUNwQkMsT0FBTyxDQUFDQyxHQUFHLENBQUNGLEdBQUcsQ0FBQztJQUNsQixDQUFDLENBQUMsU0FBTSxDQUFDLFVBQVVHLENBQUMsRUFBRTtNQUNwQkYsT0FBTyxDQUFDQyxHQUFHLENBQUNDLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUM7RUFDSjtFQUFDO0FBQ0w7QUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pDRCxjQUFjO0FBQ2QsMEJBQTBCO0FBZUU7QUFFeUI7QUFDZ0I7QUFDQTtBQUNyQjtBQUNJO0FBTXBCO0FBQ3FCO0FBQ0c7QUFFQTtBQUNYO0FBQzdDLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQzdCLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLElBQUksY0FBYyxHQUErQyxTQUFTLENBQUM7QUFDM0Usd0NBQXdDO0FBQ3hDLElBQU0sb0JBQW9CLEdBQUcsVUFBQyxXQUFtQjtJQUMvQyxJQUFJLGNBQWM7UUFDaEIsT0FBTywrREFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLE9BQU87QUFDVCxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsNkJBQWUsc0NBQVk7SUFDekIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxtRUFBb0IsRUFBRSxzREFBaUIsQ0FBQyxDQUFDO0lBQ2pFLGFBQWEsQ0FBQyxTQUFTLENBQUMscUVBQXNCLEVBQUUsd0RBQW1CLENBQUMsQ0FBQztJQUNyRSxhQUFhLENBQUMsU0FBUyxDQUFDLHFFQUFzQixFQUFFLG1FQUF5QixDQUFDLENBQUM7SUFDM0UsYUFBYSxDQUFDLFNBQVMsQ0FBQyw2RUFBOEIsRUFBRSw2REFBZSxDQUFDLENBQUM7SUFDekUsYUFBYSxDQUFDLFNBQVMsQ0FBQyx3RUFBeUIsRUFBRSx5RUFBbUIsQ0FBQyxDQUFDO0lBQ3hFLGFBQWEsQ0FBQyxTQUFTLENBQUMsK0RBQWdCLEVBQUUseUVBQXNCLENBQUMsQ0FBQztJQUNsRSxhQUFhLENBQUMsU0FBUyxDQUFDLDZEQUFjLEVBQUUscUVBQWtCLENBQUMsQ0FBQztJQUM1RCxhQUFhLENBQUMsU0FBUyxDQUFDLGtFQUFtQixFQUFFLDhEQUFpQixDQUFDLENBQUM7SUFFaEUsYUFBYSxDQUFDLFNBQVMsQ0FBQyx3RUFBeUIsRUFBRSxnRUFBZSxDQUFDLENBQUM7SUFDcEUsYUFBYSxDQUFDLFNBQVMsQ0FBQywwRUFBMkIsRUFBRSx1RUFBb0IsQ0FBQyxDQUFDO0lBQzNFLGFBQWEsQ0FBQyxTQUFTLENBQ3JCLDRFQUE2QixFQUM3QixVQUFDLEtBQWEsRUFBRSxNQUF1QjtRQUNyQyxjQUFjLEdBQUc7WUFDZixLQUFLO1lBQ0wsTUFBTTtTQUNQLENBQUM7UUFDRixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FDRixDQUFDO0lBR0oscUVBQWUsQ0FBQyxDQUFDLEVBQUUsMkJBQTJCLEVBQUUsdUJBQWdCLG1FQUFvQixlQUFLLHFFQUFzQixlQUFLLDZFQUE4QixlQUFLLHdFQUF5QixlQUFLLDBFQUEyQixlQUFLLDRFQUE2QixDQUFFLENBQUMsQ0FBQztJQUVwUCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZELGNBQWM7QUFFZCxpQ0FBaUM7QUFDRjtBQUlDO0FBRWhDOzs7O0dBSUc7QUFDSCw2QkFBZSxzQ0FBWTtJQUN6QixzRUFBZ0IsRUFBRSxDQUFDO0lBQ25CLG9EQUFNLEVBQUUsQ0FBQztJQUNULHFFQUFlLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ25CRCxjQUFjO0FBRWQsK0JBQStCO0FBTUY7QUFFUztBQUNNO0FBQ2dDO0FBRTVFLHdEQUFTLEVBQUUsQ0FBQztBQUNaLGFBQWEsQ0FBQyxTQUFTLENBQUMsa0VBQW1CLEVBQUU7SUFDM0MsYUFBYSxDQUFDLE9BQU8sQ0FBQywyRUFBNEIsRUFBRTtRQUNsRCxPQUFPLEVBQUUsSUFBSTtRQUNiLE9BQU8sRUFBRSxrRUFBWSxFQUFFO1FBQ3ZCLFNBQVMsRUFBRSxrQkFBa0I7UUFDN0IsSUFBSSxFQUFFLFVBQVU7UUFDaEIsUUFBUSxFQUFFLCtEQUFTLEVBQUU7UUFDckIsSUFBSSxFQUFFLCtEQUFTLEVBQUU7UUFDakIsT0FBTyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFO0tBQ3JDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsYUFBYSxDQUFDLFNBQVMsQ0FBQyxzRkFBdUMsRUFBRSxzREFBYSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzQmhGLGNBQWM7QUFFZCxpQ0FBaUM7QUFHRDtBQUVoQzs7OztHQUlHO0FBQ0gsNkJBQWU7SUFDYixxRUFBZSxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztJQUM1RSxJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7SUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJELGNBQWM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVkOzs7Ozs7R0FNRztBQW1CMEI7QUFVRztBQUVoQyxJQUFJLFVBQXlCLENBQUM7QUFDOUIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztBQUUxQixTQUFTLG9CQUFvQjtJQUMzQixxRUFBZSxDQUNiLENBQUMsRUFDRCxpQ0FBaUMsRUFDakMsK0RBQStELENBQ2hFLENBQUM7SUFFRixhQUFhLENBQUMsT0FBTyxDQUFDLHlFQUEwQixDQUFDLENBQUM7SUFDbEQsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQXFCO0lBQzVDLElBQUksQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRTtRQUMzRCxJQUFNLEVBQUUsR0FBRywwREFBSSxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsc0VBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO2FBQ25MLE9BQU8sQ0FBQyxzRUFBZ0IsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO0tBQzdDO0lBQ0QsSUFBSSxVQUFVO1FBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBVTs7SUFDbkMsSUFBTSxFQUFFLEdBQUcsMERBQUksRUFBRSxDQUFDO0lBQ2xCLElBQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN0RCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1FBQy9CLElBQU0sVUFBVSxHQUFHLHNFQUFnQixFQUFFLENBQUM7UUFDdEMsVUFBVSxHQUFHLE1BQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQXVCLDBDQUNyRSxhQUFhLENBQUM7UUFDbEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTthQUNwRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3BDLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxXQUFXLENBQ3JCO1lBQ0UsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUMxQixHQUFHLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztTQUM3QixFQUNELFlBQVksQ0FDYixDQUFDO0tBQ0g7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFO1FBQ2xDLG1FQUFhLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3BDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxtQkFBbUIsRUFBRTtRQUM1QyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdkM7SUFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ3ZCLElBQU0sSUFBRSxHQUFHLDBEQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFNLFlBQVUsR0FBRyxJQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdEQsSUFBTSxVQUFVLEdBQUcsc0VBQWdCLEVBQUUsQ0FBQztRQUN0QyxVQUFVLEdBQUcsTUFBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBdUIsMENBQ3JFLGFBQWEsQ0FBQztRQUNsQixZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsWUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVO2FBQ3BFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDcEMsSUFBTSxnQkFBZ0IsR0FBRyxzRUFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUM7UUFDL0Qsd0RBQXdEO1FBQ3hELDZEQUFjLENBQUMsU0FBUyxHQUFHLHVCQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsSUFBSSwwQ0FBRSxTQUFTLDBDQUFFLFVBQVUsMENBQUUsT0FBTyxDQUFDO1FBQ3ZFLG9FQUFvRTtRQUVwRSxJQUFNLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6QyxJQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELElBQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BFLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxTQUFTO1lBQzNDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUztZQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsSUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RCxJQUFNLGlCQUFpQixHQUFHLGVBQWU7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxhQUFhO1lBQ2hELENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhO1lBQ2pDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxJQUFJLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLElBQUksV0FBVyxJQUFJLGNBQWMsSUFBSSxZQUFZLEVBQUU7WUFDakQsb0JBQW9CLENBQUMsMEVBQTJCLEVBQUU7Z0JBQ2hELGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JDLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixPQUFPLEVBQUUsWUFBWTthQUN0QixDQUFDLENBQUM7U0FDSjtRQUNELElBQUksNkRBQWMsQ0FBQyxTQUFTLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDOUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrRUFBbUIsRUFBRSw2REFBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JFLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDdEI7UUFDRCxxRUFBZSxDQUFDLENBQUMsRUFBRSxxQkFBcUIsRUFBRSw2REFBYyxDQUFDLENBQUM7UUFDMUQsSUFBTSxVQUFVLEdBQUc7WUFDakIsUUFBUSxFQUFFO2dCQUNSLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTTtnQkFDekMsZ0JBQWdCO2FBQ2pCO1NBQ0YsQ0FBQztRQUNGLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUM3QjtJQUNELElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssWUFBWSxFQUFFO1lBQ2pDLHFFQUFlLENBQUMsQ0FBQyxFQUFFLCtCQUErQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPO1NBQ1I7UUFFRCxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsS0FBSyxpRUFBa0I7Z0JBQ3JCLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixLQUFLLGtFQUFtQjtnQkFDdEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrRUFBbUIsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNO1lBQ1IsS0FBSyw2REFBYztnQkFDakIsaURBQWlEO2dCQUNqRCxpRUFBVyxFQUFFLEtBQUssbURBQUk7b0JBQ3BCLENBQUMsQ0FBQyxzQkFBc0IsQ0FDdEIsV0FBVyxDQUFDLElBQUksRUFDaEIsa0JBQWtCLEVBQ2xCLG1FQUFvQixDQUNyQjtvQkFDRCxDQUFDLENBQUMsc0JBQXNCLENBQ3RCLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFDaEMsa0NBQWtDLEVBQ2xDLGlFQUFrQixDQUNuQixDQUFDO2dCQUNKLE1BQU07WUFDUixLQUFLLCtEQUFnQjtnQkFDbkIsYUFBYSxDQUFDLE9BQU8sQ0FBQyx5RUFBMEIsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNO1lBQ1I7Z0JBQ0UsTUFBTTtTQUNUO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsV0FBbUIsRUFDbkIsY0FBc0IsRUFDdEIsY0FBcUI7SUFFckIsSUFDRSxLQUFLO1FBQ0wsS0FBSyxDQUFDLFNBQVM7UUFDZixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUNyRDtRQUNBLElBQU0sV0FBVyxHQUFHLG1FQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0MsaURBQWlEO1FBQ2pELFdBQVc7WUFDVCxDQUFDLENBQUMsb0JBQW9CLENBQUMsbUVBQW9CLEVBQUUsV0FBVyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQUMsU0FBUztnQkFDakMseUVBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO1lBQXBDLENBQW9DLENBQ3JDLENBQUM7S0FDTDtBQUNILENBQUM7QUFFTSxTQUFTLHNCQUFzQjtJQUNwQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3ZCLGVBQWUsQ0FBQywrREFBZ0IsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFTSxTQUFTLGtCQUFrQjtJQUNoQyxlQUFlLENBQUMsNkRBQWMsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxpREFBaUQ7QUFDMUMsU0FBUyxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLFVBQWtCO0lBQ3hFLElBQU0sY0FBYyxHQUFHO1FBQ3JCLE9BQU8sRUFBRSwwRUFBMkI7UUFDcEMsVUFBVTtLQUNYLENBQUM7SUFDRixlQUFlLENBQUMsRUFBRSxRQUFRLGVBQU8sY0FBYyxDQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCx1QkFBdUI7QUFDaEIsU0FBUyxlQUFlLENBQzdCLFNBQWlCLEVBQ2pCLFVBQTJCO0lBRTNCLElBQU0sZ0JBQWdCLEdBQUc7UUFDdkIsT0FBTyxFQUFFLG1FQUFvQjtRQUM3QixVQUFVO0tBQ1gsQ0FBQztJQUNGLGVBQWUsQ0FBQyxFQUFFLFFBQVEsZUFBTyxnQkFBZ0IsQ0FBRSxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRU0sU0FBUyxtQkFBbUIsQ0FBQyxLQUFhO0lBQWIscUNBQWE7SUFDL0MsSUFBSTtRQUNGLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQU0sY0FBYyxHQUFHO1lBQ3JCLE9BQU8sRUFBRSxvRUFBcUI7WUFDOUIsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDO1FBQ0YsZUFBZSxDQUFDLEVBQUUsUUFBUSxlQUFPLGNBQWMsQ0FBRSxFQUFFLENBQUMsQ0FBQztLQUN0RDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsOEJBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDdkQ7QUFDSCxDQUFDO0FBRU0sU0FBZSxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7Ozs7O3dCQUN0RSxxQkFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7O29CQUE5QixTQUE4QixDQUFDO29CQUN6QixPQUFPLEdBQUcsOERBQWUsQ0FBQztvQkFDaEMsSUFBSTt3QkFDRixlQUFlLENBQUM7NEJBQ2QsUUFBUSxFQUFFLEVBQUUsT0FBTyxXQUFFLEdBQUcsT0FBRSxRQUFRLFlBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUU7eUJBQ3RFLENBQUMsQ0FBQztxQkFDSjtvQkFBQyxPQUFPLENBQUMsRUFBRSxHQUFHOzs7OztDQUNoQjtBQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUN0UHhFLGNBQWM7QUFFZCxvQkFBb0I7QUFDcEI7Ozs7O0dBS0c7QUFDSCw2QkFBZSxzQ0FBWTtJQUN2QiwyRUFBMkU7SUFDM0UsSUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBRXZCLElBQUksUUFBUSxHQUFHLEVBQUUsRUFDYixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFakIsU0FBUyxPQUFPLENBQUMsR0FBK0M7UUFDNUQsSUFBSSxHQUFHLENBQUM7UUFFUixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUM7WUFDWixJQUFLLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsY0FBYyxDQUFFLEVBQVc7UUFDaEMsT0FBTyxTQUFTLGdCQUFnQjtZQUM1QixNQUFNLEVBQUUsQ0FBQztRQUNiLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxTQUFTLG1DQUFtQyxDQUFFLFVBQTBDLEVBQUUsT0FBWSxFQUFFLElBQVM7UUFDN0csSUFBSTtZQUNBLFVBQVUsQ0FBRSxPQUFPLEVBQUUsSUFBSSxDQUFFLENBQUM7U0FDL0I7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULFVBQVUsQ0FBRSxjQUFjLENBQUUsRUFBRSxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRUQsU0FBUyxxQ0FBcUMsQ0FBRSxVQUEwQyxFQUFFLE9BQVksRUFBRSxJQUFTO1FBQy9HLFVBQVUsQ0FBRSxPQUFPLEVBQUUsSUFBSSxDQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVMsY0FBYyxDQUFFLGVBQW9CLEVBQUUsY0FBMkIsRUFBRSxJQUFTLEVBQUUsbUJBQXdCO1FBQzNHLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFDdEMsY0FBYyxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DLEVBQ2xILENBQUMsQ0FBQztRQUVOLElBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFFLGNBQWMsQ0FBRSxFQUFHO1lBQzlDLE9BQU87U0FDVjtRQUVELEtBQUssQ0FBQyxJQUFJLFdBQVcsRUFBQztZQUNsQixJQUFLLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUM7Z0JBQy9CLGNBQWMsQ0FBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBRSxDQUFDO2FBQzNEO1NBQ0o7SUFDTCxDQUFDO0lBRUQsU0FBUyxzQkFBc0IsQ0FBRSxPQUFvQixFQUFFLElBQVMsRUFBRSxtQkFBd0I7UUFDdEYsT0FBTyxTQUFTLGlCQUFpQjtZQUM3QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUUsT0FBTyxDQUFFLEVBQ3pCLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFFLEdBQUcsQ0FBRSxDQUFDO1lBRXhDLG1DQUFtQztZQUNuQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUU1RCx1REFBdUQ7WUFDdkQsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFFLENBQUMsRUFBRSxRQUFRLENBQUUsQ0FBQztnQkFDcEMsUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLGNBQWMsQ0FBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBRSxDQUFDO2FBQy9EO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELFNBQVMscUJBQXFCLENBQUUsT0FBWTtRQUN4QyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUUsT0FBTyxDQUFFLEVBQ3pCLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFFLEtBQUssQ0FBRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDcEUsUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUUsR0FBRyxDQUFFLENBQUM7UUFFeEMsT0FBUSxDQUFDLEtBQUssSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDL0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBRSxDQUFDO1lBQ3BDLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFFLEdBQUcsQ0FBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFFLEtBQUssQ0FBRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN4RTtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxTQUFTLE9BQU8sQ0FBRSxPQUFvQixFQUFFLElBQVMsRUFBRSxJQUFhLEVBQUUsbUJBQXdCO1FBQ3RGLE9BQU8sR0FBRyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUV2RSxJQUFJLE9BQU8sR0FBRyxzQkFBc0IsQ0FBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFFLEVBQ3RFLGNBQWMsR0FBRyxxQkFBcUIsQ0FBRSxPQUFPLENBQUUsQ0FBQztRQUV0RCxJQUFLLENBQUMsY0FBYyxFQUFFO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILFVBQVUsQ0FBRSxPQUFPLEVBQUUsQ0FBQyxDQUFFLENBQUM7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxPQUFvQixFQUFFLElBQVM7UUFDdEQsT0FBTyxPQUFPLENBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFFLENBQUM7SUFDdkUsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBVSxPQUFvQixFQUFFLElBQVM7UUFDMUQsT0FBTyxPQUFPLENBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFFLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxTQUFTLEdBQUcsVUFBVSxPQUFvQixFQUFFLElBQVM7UUFDeEQsSUFBSyxPQUFPLElBQUksS0FBSyxVQUFVLEVBQUM7WUFDNUIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFdkUsZ0NBQWdDO1FBQ2hDLElBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFFLE9BQU8sQ0FBRSxFQUFFO1lBQ3RDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDMUI7UUFFRCxpRkFBaUY7UUFDakYsZ0VBQWdFO1FBQ2hFLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWhDLGlDQUFpQztRQUNqQyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLGFBQWEsR0FBRyxVQUFVLE9BQVksRUFBRSxJQUFTO1FBQ3BELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUUsT0FBTyxFQUFFO1lBQ25DLHlDQUF5QztZQUN6QyxNQUFNLENBQUMsV0FBVyxDQUFFLEtBQUssQ0FBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLEdBQUcsU0FBUyxxQkFBcUI7UUFDekQsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLGtCQUFrQixDQUFDLEtBQWE7UUFDakUsSUFBSSxDQUFDLENBQUM7UUFDTixLQUFLLENBQUMsSUFBSSxRQUFRLEVBQUM7WUFDZixJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUM7Z0JBQ3JELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3RCO1NBQ0o7SUFDTCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBUyxLQUFVO1FBQ3BDLElBQUkscUJBQXFCLEdBQUcsVUFBUyxLQUFhO1lBQzFDLElBQUksQ0FBQyxDQUFDO1lBQ04sS0FBTSxDQUFDLElBQUksUUFBUSxFQUFFO2dCQUNqQixJQUFLLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZELG9DQUFvQztvQkFDcEMsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7YUFDSjtZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsRUFDRCxPQUFPLEdBQU0sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBRSxFQUM1RyxPQUFPLEdBQU0sQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUNsRCxVQUFVLEdBQUcsT0FBTyxLQUFLLEtBQUssVUFBVSxFQUN4QyxNQUFNLEdBQUcsS0FBSyxFQUNkLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWxCLElBQUksT0FBTyxFQUFDO1lBQ1IsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLE9BQU87U0FDVjtRQUVELEtBQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRTtZQUNqQixJQUFLLFFBQVEsQ0FBQyxjQUFjLENBQUUsQ0FBQyxDQUFFLEVBQUU7Z0JBQy9CLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRCLElBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDNUIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ2YsOENBQThDO29CQUM5QyxNQUFNO2lCQUNUO2dCQUVELElBQUksVUFBVSxFQUFFO29CQUNaLEtBQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRTt3QkFDaEIsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUM7NEJBQ2xELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNsQixNQUFNLEdBQUcsSUFBSSxDQUFDO3lCQUNqQjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRixNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUNsQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZSRCxjQUFjO0FBRWQsbUNBQW1DO0FBa0JOO0FBRTBDO0FBRU47QUFDUjtBQUNQO0FBRWxEOzs7R0FHRztBQUNILDZCQUFlLHNDQUFZO0lBQ2pCLElBQWMsWUFBWSxHQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxhQUF2QixDQUF3QjtJQUMxRCxhQUFhLENBQUMsU0FBUyxDQUFDLHFFQUFzQixFQUFFLCtEQUFhLENBQUMsQ0FBQztJQUMvRCxhQUFhLENBQUMsU0FBUyxDQUFDLG9FQUFxQixFQUFFLCtEQUFhLENBQUMsQ0FBQztJQUM5RCxhQUFhLENBQUMsU0FBUyxDQUFDLG9FQUFxQixFQUFFLHVEQUF3QixDQUFDLENBQUM7SUFFekUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxrRUFBbUIsRUFBRSwrREFBYSxDQUFDLENBQUM7SUFDNUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyw2RUFBOEIsRUFBRSxzRUFBaUIsQ0FBQyxDQUFDO0lBRXBFLFlBQVksQ0FBQyxHQUFHLENBQ2QsNEVBQTZCLEVBQzdCLFVBQUMsRUFBOEI7WUFBNUIsTUFBTTtRQUNQLG9FQUFjLENBQUMsNEVBQTZCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUNGLENBQUM7SUFDRixZQUFZLENBQUMsR0FBRyxDQUNkLHdFQUF5QixFQUN6QixVQUFDLEVBQThCO1lBQTVCLE1BQU07UUFDUCxvRUFBYyxDQUFDLHdFQUF5QixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FDRixDQUFDO0lBQ0YsWUFBWSxDQUFDLEdBQUcsQ0FDZCwwRUFBMkIsRUFDM0IsVUFBQyxFQUE4QjtZQUE1QixNQUFNO1FBQ1Asb0VBQWMsQ0FBQywwRUFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQ0YsQ0FBQztJQUNGLFlBQVksQ0FBQyxHQUFHLENBQUMseUVBQTBCLEVBQUU7UUFDM0MsMkVBQWMsQ0FBQyx5RUFBMEIsQ0FBQztJQUExQyxDQUEwQyxDQUMzQyxDQUFDO0lBRUYsWUFBWSxDQUFDLEdBQUcsQ0FDZCxtRUFBb0IsRUFDcEIsVUFBQyxDQUE0QztRQUMzQywrREFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FDRixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtRQUM5RCxZQUFZLENBQUMsR0FBRyxDQUFDLHFFQUFzQixFQUFFLFVBQUMsRUFBOEI7Z0JBQTVCLE1BQU07WUFDaEQsMkVBQWMsQ0FBQyxxRUFBc0IsRUFBRSxNQUFNLENBQUM7UUFBOUMsQ0FBOEMsQ0FDL0MsQ0FBQztRQUVGLFlBQVksQ0FBQyxHQUFHLENBQUMsbUVBQW9CLEVBQUUsVUFBQyxFQUE4QjtnQkFBNUIsTUFBTTtZQUM5QywyRUFBYyxDQUFDLG1FQUFvQixFQUFFLE1BQU0sQ0FBQztRQUE1QyxDQUE0QyxDQUM3QyxDQUFDO1FBRUYsWUFBWSxDQUFDLEdBQUcsQ0FDZCx3RUFBeUIsRUFDekIsVUFBQyxFQUE4QjtnQkFBNUIsTUFBTTtZQUNQLDJFQUFjLENBQUMsd0VBQXlCLEVBQUUsTUFBTSxDQUFDO1FBQWpELENBQWlELENBQ3BELENBQUM7UUFFRixZQUFZLENBQUMsR0FBRyxDQUFDLHlFQUEwQixFQUFFO1lBQzNDLDJFQUFjLENBQUMseUVBQTBCLENBQUM7UUFBMUMsQ0FBMEMsQ0FDM0MsQ0FBQztLQUNIO0lBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyx1RUFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRkQsY0FBYztBQUNkLDBDQUEwQztBQVNiO0FBRVU7QUFLUDtBQUVoQzs7O0dBR0c7QUFDSSxTQUFTLGlDQUFpQztJQUMvQyxhQUFhLENBQUMsT0FBTyxDQUFDLHNGQUF1QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLHFFQUFlLENBQUMsQ0FBQyxFQUFFLCtCQUErQixFQUFFLHFCQUFjLHNGQUF1QyxDQUFFLENBQUMsQ0FBQztBQUMvRyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksU0FBUywrQkFBK0I7SUFDN0MsYUFBYSxDQUFDLE9BQU8sQ0FBQyxpRkFBa0MsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxxRUFBZSxDQUFDLENBQUMsRUFBRSwrQkFBK0IsRUFBRSxxQkFBYyxpRkFBa0MsQ0FBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxTQUFTLDRCQUE0QixDQUFDLFNBQWlCLEVBQUUsbUJBQTJCO0lBQ3pGLElBQU0sRUFBRSxHQUFHLDBEQUFJLEVBQUUsQ0FBQztJQUNsQixJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ1AsY0FBYyxDQUFDLEVBQUUsbUJBQW1CLHVCQUFFLENBQUMsQ0FBQztLQUN6QztTQUNJO1FBQ0gsbUJBQW1CLEdBQUcsdUVBQWlCLEVBQUUsQ0FBQztRQUMxQyxVQUFVLENBQUMsRUFBRSxtQkFBbUIsdUJBQUUsQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QscUVBQWUsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFJTSxJQUFNLFVBQVUsR0FBRyxVQUFDLEVBQXFEO1FBQW5ELG1CQUFtQjtJQUM5QyxJQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUM7SUFDeEQsSUFBTSxRQUFRLEdBQUcsdUVBQWlCLEVBQUUsQ0FBQztJQUNyQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRztRQUN6QixhQUFhLENBQUMsT0FBTyxDQUFDLGlGQUFrQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDO0lBQ0YsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUc7UUFDeEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxzRkFBdUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzRCxDQUFDLENBQUM7QUFHSyxJQUFNLGNBQWMsR0FBRyxVQUFDLEVBQXdEO1FBQXRELG1CQUFtQjtJQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDMUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDakMsaUVBQWtCLEVBQ2xCLCtCQUErQixDQUNoQyxDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDakMsa0VBQW1CLEVBQ25CLGlDQUFpQyxDQUNsQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0ksU0FBUyx5QkFBeUI7SUFDdkMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxrRUFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxxRUFBZSxDQUFDLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxxQkFBYyxrRUFBbUIsQ0FBRSxDQUFDLENBQUM7SUFDL0UsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksU0FBUyx1QkFBdUI7SUFDckMsbURBQWMsRUFBRSxDQUFDO0lBQ2pCLHlCQUF5QixFQUFFLENBQUM7SUFDNUIsYUFBYSxDQUFDLFNBQVMsQ0FBQywyRUFBNEIsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCw2QkFBZTtJQUNiLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7UUFDMUUsdUJBQXVCLEVBQUUsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsUUFBUSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixFQUFFLHVCQUF1QixDQUFDLENBQUM7S0FDL0U7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySEQsbUNBQW1DO0FBS0g7QUFJaEM7Ozs7O0dBS0c7QUFDSCw2QkFBZTtJQUNiLElBQU0sTUFBTSxHQUFHLCtEQUFTLEVBQUUsQ0FBQztJQUMzQixJQUFNLEVBQUUsR0FBRywwREFBSSxFQUFFLENBQUM7SUFDbEIsbUJBQW1CO0lBQ25CLHFFQUFlLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFFeEUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNQLElBQUk7WUFDRixJQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELGFBQWEsQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLENBQUM7WUFDMUMsSUFBTSxxQkFBcUIsR0FBRywyRkFBMkYsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkksSUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcscUJBQXFCLENBQUM7WUFDeEQsYUFBYSxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztZQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMxQztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDZjtLQUNGO0lBQ0QscUVBQWUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDN0QsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQztJQUM1QixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDbkMsSUFBTSxlQUFlLEdBQUcsb0NBQW9DLENBQUM7SUFDN0QsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxHQUFHLFVBQUcsTUFBTSxTQUFHLGVBQWUsQ0FBRSxDQUFDO0lBQzNDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFDRCxjQUFjOzs7Ozs7Ozs7Ozs7QUFFZCxnREFBZ0Q7QUFFVztBQUNtRDtBQUNzSDtBQUM3SztBQUNFO0FBQ3pEOzs7O0dBSUc7QUFDSSxTQUFTLHNCQUFzQixDQUFDLFFBQWdCO0lBQ3JELG1FQUFhLENBQUMsb0ZBQXFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtRQUNwRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBRyw0REFBYSxvQkFBVSxRQUFRLENBQUUsQ0FBQyxDQUFDO0tBQzNFO0lBQ0QscUVBQWUsQ0FBQyxDQUFDLEVBQUUsdUNBQXVDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEUsNkRBQXNCLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELHdFQUFrQixFQUFFLENBQUM7SUFDckIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBQ0Q7Ozs7Ozs7Ozs7R0FVRztBQUNJLFNBQVMsd0JBQXdCLENBQUMsUUFBaUQ7SUFDeEYsb0JBQW9CO0lBQ3BCLElBQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztJQUM1QyxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELCtHQUErRztJQUMvRyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hCLG1FQUFhLENBQUMsb0ZBQXFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsbUVBQWEsQ0FBQywwRUFBMkIsYUFBSSxjQUFjLG9CQUFLLFFBQVEsRUFBRztJQUMzRSxxRUFBZSxDQUFDLENBQUMsRUFBRSx1Q0FBdUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILDZCQUFlLG9DQUFVLEtBQWEsRUFBRSxLQUFhOztJQUNuRCxJQUFJO1FBQ0YsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQztTQUNwRDtRQUFBLENBQUM7UUFFRixJQUFNLGNBQWMsR0FBRyxpRUFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFNLFFBQVEsR0FBRywwQkFBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLFdBQVcsMENBQUUsR0FBRywwQ0FBRSxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLElBQU0sYUFBYSxHQUFHLG9CQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsSUFBSSwwQ0FBRSxhQUFhLENBQUM7UUFFMUQsNEZBQTRGO1FBQzVGLElBQUksUUFBUSxJQUFJLGFBQWEsRUFBRTtZQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLGlGQUFpRixDQUFDO1lBQzlGLFVBQVU7U0FDWDtRQUVELElBQU0sWUFBVSxHQUFHLHNFQUFnQixFQUFFLENBQUM7UUFDdEMsSUFBTSxrQkFBZ0IsR0FBRztZQUN2QixZQUFZLEVBQUUsS0FBSztZQUNuQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7U0FDaEM7UUFDRCxxRUFBZSxDQUFDLENBQUMsRUFBRSw4QkFBOEIsRUFBRSxrQkFBZ0IsQ0FBQyxDQUFDO1FBRXJFLElBQU0sY0FBYyxHQUFHLFVBQUMsS0FBYSxFQUFFLGVBQXVCO1lBQzVELHFFQUFlLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsQ0FBQztZQUN6RCxJQUFNLDhCQUE4QixHQUFFLFVBQUcsZUFBZSxDQUFDLFlBQVUsQ0FBQyxDQUFDLE9BQU8sU0FBRyw2RUFBOEIsQ0FBRSxDQUFDO1lBQ2hILHVFQUFjLENBQUMsOEJBQThCLEVBQUU7Z0JBQzdDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFnQixDQUFDO2dCQUN0QyxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtpQkFDbkM7Z0JBQ0QsV0FBVyxFQUFFLFNBQVM7YUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDQyw0Q0FBNEM7UUFDOUMsSUFBSSxDQUFDLDZEQUFjLENBQUMsU0FBUyxFQUFFO1lBQzdCLDhEQUE4RDtZQUM5RCxhQUFhLENBQUMsU0FBUyxDQUFDLGtFQUFtQixFQUFFLGNBQWMsQ0FBQztZQUM1RCxxRUFBZSxDQUFDLENBQUMsRUFBRSxvQ0FBb0MsRUFBRSxFQUFFLENBQUM7U0FDN0Q7YUFBTTtZQUNMLHFCQUFxQjtZQUNyQixjQUFjLENBQUMsa0VBQW1CLEVBQUUsNkRBQWMsQ0FBQyxTQUFTLENBQUM7WUFDN0QscUVBQWUsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1NBQ3pDO0tBQ0Y7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLHFFQUFlLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLHdFQUFrQixFQUFFLENBQUM7S0FDdEI7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZHRCxjQUFjO0FBRWQsb0NBQW9DO0FBQ3lDO0FBQ3JCO0FBRXhELFNBQVMsWUFBWSxDQUFDLEdBQVE7SUFDNUIsSUFBTSxXQUFXLEdBQ2YsS0FBSztRQUNMLEtBQUssQ0FBQyxTQUFTO1FBQ2YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQztRQUNoRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsSUFBTSxhQUFhLEdBQUc7UUFDcEIsTUFBTSxFQUFFO1lBQ04sTUFBTSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQ3RFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsUUFBUSxFQUFFLFVBQUMsSUFLVjtZQUNDLElBQUksUUFBUSxHQUNWLElBQUksQ0FBQyxJQUFJO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtnQkFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO2dCQUNoQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRVQsSUFDRSxRQUFRLEtBQUssRUFBRTtnQkFDZixPQUFPLG1CQUFtQixLQUFLLFdBQVc7Z0JBQzFDLG1CQUFtQixFQUNuQjtnQkFDQSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO2FBQ3ZDO1lBRUQsSUFDRSxRQUFRLEtBQUssRUFBRTtnQkFDZixJQUFJLENBQUMsSUFBSTtnQkFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFDekI7Z0JBQ0EsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDL0M7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsNkNBQTZDO1FBQzdDLFdBQVcsRUFBRTtZQUNYLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDaEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQyxJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUV4QyxJQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzFDLElBQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRTlDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxVQUFDLElBQWtDO1lBQ3RDLFdBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQXBDLENBQW9DO1FBRXRDLGFBQWEsRUFBRSxVQUFDLElBQXNDOztZQUNwRCxJQUFNLGFBQWEsR0FBRyxXQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsSUFBSSwwQ0FBRSxhQUFhO2dCQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO2dCQUN6QixDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ1YsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxVQUNULElBQXVFLEVBQ3ZFLE1BQWM7WUFFZCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUVsQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQy9CLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN2QyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDckMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7YUFDdEM7WUFFRCxRQUFRLE1BQU0sRUFBRTtnQkFDZCxLQUFLLE9BQU87b0JBQ1YsSUFBSSxTQUFTLEtBQUssRUFBRSxJQUFJLFFBQVEsS0FBSyxFQUFFLEVBQUU7d0JBQ3ZDLE9BQU8sUUFBUSxDQUFDO3FCQUNqQjtvQkFDRCxPQUFPLFNBQVMsQ0FBQztnQkFFbkIsS0FBSyxNQUFNO29CQUNULE9BQU8sUUFBUSxDQUFDO2dCQUVsQjtvQkFDRSxPQUFPLFFBQVEsQ0FBQzthQUNuQjtRQUNILENBQUM7UUFFRCxTQUFTLEVBQUUsVUFBQyxJQUVYLElBQUssb0JBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUF0QyxDQUFzQztRQUU1QyxRQUFRLEVBQUUsVUFBQyxJQUVWLElBQUssb0JBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFyQyxDQUFxQztRQUUzQyw2Q0FBNkM7UUFDN0MsVUFBVSxFQUFFLFVBQUMsSUFBMEMsRUFBRSxJQUFZO1lBQ25FLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRSxLQUFLLElBQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN6QyxRQUFRLElBQUksRUFBRTt3QkFDWixLQUFLLElBQUk7NEJBQ1AsT0FBTyxPQUFPLENBQUM7d0JBQ2pCLEtBQUssTUFBTTs0QkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxRQUFRO3FCQUNUO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUM7YUFDWDtRQUNILENBQUM7UUFFRCxZQUFZLEVBQUUsVUFBQyxJQUEwQztZQUN2RCxvQkFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQXBDLENBQW9DO1FBRXRDLGNBQWMsRUFBRSxVQUFDLElBQTBDO1lBQ3pELG9CQUFhLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7UUFBdEMsQ0FBc0M7UUFFeEMsS0FBSyxFQUFFLFVBQUMsSUFBOEI7WUFDcEMsV0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFBaEMsQ0FBZ0M7UUFFbEMsV0FBVyxFQUFFLFVBQUMsSUFBaUM7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFFN0QsSUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM1RDtZQUVELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsVUFBVSxFQUFFLFVBQUMsSUFBaUM7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFFN0QsSUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUMzRDtZQUVELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsaUJBQWlCLEVBQUUsVUFBQyxJQUFzQztZQUN4RCxJQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUM7WUFFNUMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDMUQsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUMvQixLQUFLLENBQUMsV0FBVyxLQUFLLE1BQU07b0JBRTVCLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUUzRCxNQUFNLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxDQUFDO1FBRUQsWUFBWSxFQUFFO1lBQ1osSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUV2QyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxRCxJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7b0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQy9CLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTTtvQkFFNUIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBRTNELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsWUFBWSxFQUFFO1lBQ1osSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUV2QyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxRCxJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7b0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQy9CLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTTtvQkFFNUIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBRTNELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsY0FBYyxFQUFFO1lBQ2QsSUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQztZQUV6QyxJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxRCxJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7b0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQy9CLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTTtvQkFFNUIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBRTNELE1BQU0sQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsZ0JBQWdCLEVBQUU7WUFDaEIsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1lBRXpDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzFELElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtvQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDL0IsS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNO29CQUU1QixPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsb0JBQW9CLEVBQUU7WUFDcEIsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDO1lBRTdDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzFELElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtvQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDL0IsS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNO29CQUU1QixPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2dCQUNwQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsa0JBQWtCLEVBQUU7WUFDbEIsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1lBRTNDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQzFELElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtvQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDL0IsS0FBSyxDQUFDLFdBQVcsS0FBSyxNQUFNO29CQUU1QixPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUUzQyxNQUFNLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxPQUFPLEtBQUssQ0FBQzthQUNkO1lBRUQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsb0JBQW9CLEVBQUUsVUFBQyxJQUErQztZQUNwRSxXQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCO2dCQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0I7Z0JBQ2xDLENBQUMsQ0FBQyxFQUFFO1FBRk4sQ0FFTTtRQUVSLE1BQU0sRUFBRSxVQUFDLElBQTRDOztZQUNuRCx5RUFBeUU7WUFDekUsSUFBTSxhQUFhLEdBQXdDLEtBQUssQ0FBQyxPQUFPLENBQ3RFLE1BQU0sQ0FBQyxhQUFhLENBQ3JCO2dCQUNDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDdEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztZQUMzQyxJQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUNwQyxVQUFDLEVBQVM7b0JBQVAsS0FBSztnQkFBTyxZQUFLLEtBQUssVUFBVTtZQUFwQixDQUFvQixDQUNwQyxDQUFDO1lBQ0YsSUFBTSxRQUFRLEdBQ1osU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUMzRCxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNYLElBQ0UsSUFBSSxDQUFDLElBQUk7Z0JBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QjtnQkFDQSxJQUNFLFFBQVE7b0JBQ1IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7b0JBQ3ZCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDbkIsYUFBYSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFDNUI7b0JBQ0EsT0FBTyxhQUFhLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQzt3QkFDakMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLFFBQVE7eUJBQzNDLFVBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUNoQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBOEMsQ0FDM0QsMENBQUUsTUFBTTt3QkFDVCxDQUFDLENBQUMsVUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQ2hCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUE4QyxDQUMzRCwwQ0FBRSxNQUFNO3dCQUNYLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ1I7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQ3JDO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUM7YUFDWDtRQUNILENBQUM7UUFFRCxXQUFXLEVBQUUsVUFBQyxJQUFxRDtZQUNqRSxXQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7Z0JBQ25DLENBQUMsQ0FBQyxFQUFFO1FBRk4sQ0FFTTtRQUVSLFlBQVksRUFBRSxVQUFDLElBQXNEO1lBQ25FLFdBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYTtnQkFDcEMsQ0FBQyxDQUFDLEVBQUU7UUFGTixDQUVNO0tBQ1QsQ0FBQztJQUNGLE1BQU0sQ0FBQyxXQUFXLEdBQUc7UUFDbkIsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO1FBQ3RDLFdBQVcsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUN0QyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDL0MsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1FBQ3hDLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztRQUNwQyxZQUFZLEVBQUUsV0FBVyxDQUFDLGFBQWE7UUFDdkMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ2xDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWTtRQUN0QyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsZ0JBQWdCO1FBQzlDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWTtRQUN0QyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsZ0JBQWdCO1FBQzlDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtRQUN0QixZQUFZLEVBQUUsYUFBYSxDQUFDLFdBQVcsRUFBRTtRQUN6QyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsZ0JBQWdCO1FBQzlDLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztRQUNwQyxXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVc7UUFDcEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRTtRQUNwRCxZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRTtRQUMxQyxZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRTtRQUMxQyxjQUFjLEVBQUUsYUFBYSxDQUFDLGNBQWMsRUFBRTtRQUM5QyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUU7UUFDbEQsb0JBQW9CLEVBQUUsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1FBQzFELGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRTtRQUN0RCxTQUFTLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRTtRQUNqQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFDckMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ3JDLEdBQUcsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUNuQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDakMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQ3BDLFVBQVUsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztRQUM3QyxTQUFTLEVBQUUsV0FBVyxDQUFDLFFBQVE7UUFDL0IsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1FBQ3hDLHNCQUFzQixFQUFFLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7UUFDL0QsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDM0MsZUFBZSxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQy9DLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWTtRQUN0QyxZQUFZLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFDNUMsNkJBQTZCLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDeEQsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLGlCQUFpQjtRQUNoRCxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDL0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXO1FBQ3BDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUTtRQUM5Qix3QkFBd0IsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUN4RCx5QkFBeUIsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztRQUMxRCxlQUFlLEVBQUUsV0FBVyxDQUFDLGVBQWU7S0FDN0MsQ0FBQztJQUVGLFNBQVMsYUFBYSxDQUFDLEtBQVU7UUFDL0IsSUFBTSxLQUFLLEdBQ1QsS0FBSyxLQUFLLEVBQUU7WUFDWixLQUFLLEtBQUssSUFBSTtZQUNkLE9BQU8sS0FBSyxLQUFLLFdBQVc7WUFDNUIsQ0FBQyxnRUFBVSxDQUFDLEtBQUssQ0FBQztZQUNsQixDQUFDLGdFQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxJQUFNLElBQUksSUFBSSxXQUFXLEVBQUU7UUFDOUIsSUFBSSxhQUFhLENBQUUsV0FBbUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQzdELHVDQUF1QztZQUN2QyxTQUFTO1NBQ1Y7YUFBTTtZQUNMLE9BQVEsV0FBbUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRDtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLElBQUksaUVBQVcsRUFBRSxLQUFLLHNEQUFPLElBQUksaUVBQVcsRUFBRSxLQUFLLHVEQUFRLEVBQUU7UUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLFdBQVc7WUFDaEIsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHO2dCQUNoQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7S0FDeEM7U0FBTTtRQUNMLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDL0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRWMsU0FBUyxXQUFXO0lBQ2pDLElBQUksaUVBQVcsRUFBRSxLQUFLLHNEQUFPLElBQUksaUVBQVcsRUFBRSxLQUFLLHVEQUFRLEVBQUU7UUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLFdBQVc7WUFDaEIsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHO2dCQUNoQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdkMsMENBQTBDO1FBQzFDLElBQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztLQUN4RDtTQUFNO1FBQ0wsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUMvQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEIsMENBQTBDO1FBQzFDLElBQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztLQUN4RDtBQUNILENBQUM7QUFDRCxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHO0lBQ2hCLElBQUksRUFBRSxXQUFXO0lBQ2pCLE1BQU0sRUFBRSxPQUFPO0NBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsZEYsY0FBYzs7Ozs7Ozs7Ozs7O0FBRWQsOEJBQThCO0FBR0Q7QUFFN0I7Ozs7O0dBS0c7QUFDSCxzQ0FBc0M7QUFDdEMsSUFBTSxXQUFXLEdBQUcsU0FBUyxTQUFTLENBQUMsSUFBVyxFQUFFLElBQVc7SUFDN0QsMENBQTBDO0lBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTlDLHFEQUFxRDtJQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7S0FDdkM7SUFFRCx5QkFBeUI7SUFDekIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxzQ0FBc0M7QUFDdEMsSUFBTSxPQUFPLEdBQUcsU0FBUyxZQUFZLENBQUMsS0FBWSxFQUFFLEtBQVksRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMxRixzQkFBc0I7SUFDdEIsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCw0Q0FBNEM7SUFDNUMsSUFBSSxLQUFLLEtBQUssb0JBQW9CLEVBQUU7UUFDbEMsNkNBQTZDO1FBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO1FBQ25CLDZDQUE2QztRQUM3QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0tBQ3BCO0lBRUQsb0NBQW9DO0lBQ3BDLElBQUksS0FBSyxLQUFLLGlCQUFpQixFQUFFO1FBQy9CLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsNkNBQTZDO1lBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7U0FDdEI7S0FDRjtJQUVELHVCQUF1QjtJQUN2QixJQUFJLEtBQUssS0FBSyxnQkFBZ0IsRUFBRTtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUM5Qiw2Q0FBNkM7WUFDN0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUNwQjtLQUNGO0lBRUQsMkRBQTJEO0lBQzNELDBCQUEwQjtJQUMxQixJQUFJLEtBQUssS0FBSyxtQkFBbUIsRUFBRTtRQUNqQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDekMsNkNBQTZDO1lBQzdDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDcEI7S0FDRjtTQUFNLElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtRQUMxQiw2Q0FBNkM7UUFDN0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUNwQjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxzQ0FBc0M7QUFDdEMsSUFBTSxJQUFJLEdBQUcsU0FBUyxlQUFlLENBQUMsSUFBWSxFQUFFLElBQWE7SUFDL0QsNkNBQTZDO0lBQzdDLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLGlCQUFpQixFQUFFO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxZQUFZO0lBQ1osSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRWYsZ0NBQWdDO0lBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzlELEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDL0Q7SUFFRCx3REFBd0Q7SUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7S0FDRjtJQUVELG1DQUFtQztJQUNuQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNZLFNBQVMsY0FBYyxDQUFDLElBQVksRUFBRSxpQkFBeUIsRUFBRSxjQUFzQjtJQUNwRyxJQUFJLE9BQU8sQ0FBQztJQUNaLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2xDLDZDQUE2QztRQUM3QyxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7S0FDOUI7SUFFRCxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQU0sb0JBQW9CLEdBQUcsaUJBQWlCLENBQUM7SUFDL0MsSUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUM7SUFDekMsSUFBSSxVQUFVLENBQUM7SUFFZixJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixFQUFFO1FBQzdDLFVBQVUseUJBQ0wsU0FBUyxLQUNaLG9CQUFvQix3QkFDcEIsaUJBQWlCLHNCQUNsQixDQUFDO0tBQ0g7U0FBTSxJQUFJLG9CQUFvQixFQUFFO1FBQy9CLFVBQVUseUJBQ0wsU0FBUyxLQUNaLG9CQUFvQix5QkFDckIsQ0FBQztLQUNIO1NBQU0sSUFBSSxpQkFBaUIsRUFBRTtRQUM1QixVQUFVLHlCQUNMLFNBQVMsS0FDWixpQkFBaUIsc0JBQ2xCLENBQUM7S0FDSDtTQUFNO1FBQ0wsVUFBVSxnQkFDTCxTQUFTLENBQ2IsQ0FBQztLQUNIO0lBRUQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxxRUFBc0IsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUxRCxJQUFNLGVBQWUseUJBQ2hCLElBQUksR0FDSixPQUFPLENBQ1gsQ0FBQztJQUVGLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcEtELGNBQWM7QUFFZCw4QkFBOEI7QUFJRDtBQUlHO0FBRWhDOzs7OztHQUtHO0FBQ0gsNkJBQWUsb0NBQVUsU0FBaUIsRUFBRSxPQUFlO0lBQ3pELElBQUk7UUFDRixxRUFBZSxDQUFDLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDckQ7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLHFFQUFlLENBQUMsQ0FBQyxFQUFFLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELGFBQWEsQ0FBQyxPQUFPLENBQUMsNkVBQThCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBRyw0REFBYSxvQkFBVSxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQ3pILHdFQUFrQixFQUFFLENBQUM7S0FDdEI7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0JELGNBQWM7QUFFa0w7QUFDM0U7QUFDNUQ7QUFFekQ7Ozs7R0FJRztBQUNJLFNBQVMsa0JBQWtCLENBQUMsUUFBYTtJQUM5QyxtRUFBYSxDQUFDLGdGQUFpQyxFQUFFLFFBQVEsQ0FBQztJQUMxRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQ3BELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxVQUFHLDREQUFhLG9CQUFVLFFBQVEsQ0FBRSxDQUFDLENBQUM7S0FDM0U7SUFDRCw2REFBc0IsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxxRUFBZSxDQUFDLENBQUMsRUFBRSwyQkFBMkIsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRCx3RUFBa0IsRUFBRSxDQUFDO0lBQ3JCLE9BQU8sS0FBSyxDQUFDO0FBRWYsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0ksU0FBUyxvQkFBb0IsQ0FBQyxRQUFnQjtJQUNuRCxtRUFBYSxDQUFDLGdGQUFpQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNELHFFQUFlLENBQUMsQ0FBQyxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCw2QkFBZSxvQ0FBVSxLQUFhLEVBQUUsRUFHRDtRQUZyQyxNQUFNLGNBQ04sVUFBVTtJQUVWLElBQUk7UUFDRixJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDO1NBQ3ZFO1FBQ0QsSUFBTSxhQUFXLEdBQUc7WUFDbEIsVUFBVTtTQUNYLENBQUM7UUFDRixJQUFJLE1BQU0sSUFBSSxVQUFVLEVBQUU7WUFDeEIsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQU0sWUFBVSxHQUFHLHNFQUFnQixFQUFFLENBQUM7WUFDdEMsSUFBTSxJQUFJLEdBQUcsNkRBQU8sRUFBRSxDQUFDO1lBQ3ZCLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBVyxDQUFDO1lBQ2hELElBQU0sdUJBQXFCLEdBQUc7Z0JBQzVCLGVBQWUsRUFBRSxhQUFhO2dCQUM5QixTQUFTLEVBQUUsWUFBWTtnQkFDdkIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsd0JBQXdCLEVBQUUsR0FBRzthQUM5QixDQUFDO1lBQ0YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsNENBQTRDLEVBQUUsdUJBQXFCLENBQUMsQ0FBQztZQUV4RixJQUFNLGFBQVcsR0FBRyxVQUFDLEtBQWEsRUFBRSxpQkFBK0M7Z0JBQ2pGLElBQU0seUJBQXlCLEdBQUcsVUFBRyxpQkFBaUIsQ0FBQyxZQUFVLENBQUMsQ0FBQyxPQUFPLFNBQUcsZ0ZBQWlDLENBQUUsQ0FBQztnQkFDakgsS0FBSyxDQUFDLHlCQUF5QixFQUFFO29CQUMvQixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBcUIsQ0FBQztvQkFDM0MsT0FBTyxFQUFFO3dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7cUJBQ25DO29CQUNELFdBQVcsRUFBRSxTQUFTO2lCQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsSUFBSSxJQUFLLFdBQUksQ0FBQyxJQUFJLEVBQUUsRUFBWCxDQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7WUFDckYsQ0FBQztZQUNELDRDQUE0QztZQUM1QyxJQUFJLENBQUMsNkRBQWMsQ0FBQyxTQUFTLEVBQUU7Z0JBQzNCLDhEQUE4RDtnQkFDOUQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxrRUFBbUIsRUFBRSxVQUFDLFNBQWlCLEVBQUUsSUFBUyxJQUFPLGFBQVcsQ0FBQyxrRUFBbUIsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7Z0JBQzFILHFFQUFlLENBQUMsQ0FBQyxFQUFFLHFDQUFxQyxFQUFFLEVBQUUsQ0FBQzthQUNoRTtpQkFBTTtnQkFDSCxxQkFBcUI7Z0JBQ3JCLGFBQVcsQ0FBQyxrRUFBbUIsRUFBRSw2REFBYyxDQUFDLFNBQVMsQ0FBQztnQkFDMUQscUVBQWUsQ0FBQyxDQUFDLEVBQUUsZ0NBQWdDLEVBQUUsNkRBQWMsQ0FBQzthQUNuRTtTQUVOO2FBQU07WUFDTCxxRUFBZSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLENBQUM7U0FDaEQ7S0FDRjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1Ysa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0tBQ3RCO0FBRUgsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUN0R0QsY0FBYzs7Ozs7Ozs7Ozs7O0FBRWQsb0JBQW9CO0FBQ3BCLDRCQUE0QjtBQU1DO0FBSUc7QUFFaEM7Ozs7O0dBS0c7QUFDSCwrREFBZSxVQUFDLFNBQWlCLEVBQUUsb0JBQWtIO0lBQ25KLElBQUk7UUFDRixJQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUcsWUFBWTtZQUFFLE9BQU87UUFDeEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUU1QixpQkFBYSxHQUNYLG9CQUFvQixjQURULEVBQUUsWUFBWSxHQUN6QixvQkFBb0IsYUFESyxFQUFFLFlBQVksR0FDdkMsb0JBQW9CLGFBRG1CLEVBQUUsWUFBWSxHQUNyRCxvQkFBb0IsYUFEaUMsQ0FDaEM7UUFDekIsSUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUYsSUFBTSxhQUFhLEdBQUc7WUFDcEIsV0FBVyxFQUFFLFVBQUcsUUFBUSxjQUFJLFlBQVksQ0FBRTtZQUMxQyxZQUFZO1lBQ1osYUFBYTtZQUNiLFlBQVk7U0FDYixDQUFDO1FBQ0YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUMvRCxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLGlIQUFpSDtRQUNqSCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O1lBQ3BCLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQ3ZDLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQUUsT0FBTztZQUNqQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQXNCLENBQUM7WUFBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN0RSxRQUFFLENBQUMsVUFBVSwwQ0FBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtZQUNsQyxHQUFHLEVBQUUsYUFBYSxDQUFDLFdBQVc7U0FDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSixnRkFBZ0Y7UUFFaEYsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFDLEdBQVc7Z0JBQzlCLElBQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxJQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzlDLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzVDLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLElBQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFFLEVBQUMsbUVBQW1FO2dCQUNoUCxJQUFNLGVBQWUsR0FBRztvQkFDdEIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3RDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDMUQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzNGO3FCQUNGO29CQUNELE9BQU8sU0FBUyxDQUFDO2dCQUNuQixDQUFDLENBQUM7Z0JBRUYsaUNBQWlDO2dCQUNqQywwR0FBMEc7Z0JBQzFHLDRGQUE0RjtnQkFFNUYsYUFBYSxDQUFDLE9BQU8sQ0FBQyxxRUFBc0IsZUFBTyxHQUFHLEVBQUcsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBR0osQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O1lBQ3BCLElBQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQ3ZDLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQUUsT0FBTztZQUNqQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQXNCLENBQUM7WUFBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN0RSxRQUFFLENBQUMsVUFBVSwwQ0FBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtZQUMzQixHQUFHLEVBQUUsVUFBRyxhQUFhLENBQUMsYUFBYSxjQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUU7U0FDcEUsQ0FBQyxDQUFDLENBQUM7UUFHSixhQUFhLENBQUMsT0FBTyxDQUFDLG9FQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xEO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixxRUFBZSxDQUFDLENBQUMsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxhQUFhLENBQUMsT0FBTyxDQUFDLDRFQUE2QixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQUcsNERBQWEsb0JBQVUsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUN6SCx3RUFBa0IsRUFBRSxDQUFDO0tBQ3RCO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5RkYsY0FBYztBQUVkLDZCQUE2QjtBQUNNO0FBSU47QUFHSTtBQUVqQyxJQUFJLFlBQVksR0FBVyxFQUFFLENBQUM7QUFDOUIsSUFBSSxVQUFrQixDQUFDO0FBQ3ZCLElBQUksYUFBcUIsQ0FBQztBQUUxQixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO0lBQ2pDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFDSCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFO0lBQ3JDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDWSxTQUFTLHdCQUF3QjtJQUM5QyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsMEVBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsSUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLElBQUksUUFBUSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDMUMsSUFBSSxjQUFjLEdBQUcsRUFBRSxFQUFFO2dCQUN2QixhQUFhLENBQUMsT0FBTyxDQUFDLDZEQUFjLENBQUMsQ0FBQztnQkFDdEMsY0FBYyxFQUFFLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0wsY0FBYyxFQUFFLENBQUM7YUFDbEI7U0FDRjtJQUNILENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVWLGFBQWEsQ0FBQyxPQUFPLENBQUMsNkRBQWMsQ0FBQyxDQUFDO0lBRXRDLFNBQVMsY0FBYztRQUNyQiwwRUFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUIsYUFBYSxDQUFDLFdBQVcsQ0FBQyx5RUFBMEIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxhQUFhLENBQUMsU0FBUyxDQUFDLHlFQUEwQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFTSxTQUFTLGlCQUFpQjtJQUMvQixZQUFZLEdBQUcsc0RBQVEsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ25FLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQ3RERCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWQsOEVBQThFO0FBQzlFLHlHQUF5RztBQUV6RyxpQkFBaUI7QUFDakIsNkRBQTZEO0FBQzdELHdEQUF3RDtBQUN4RCx1REFBdUQ7QUFDdkQsc0JBQXNCO0FBQ3RCLGtDQUFrQztBQUNsQyxvREFBb0Q7QUFDcEQsc0JBQXNCO0FBQ3RCLG9FQUFvRTtBQUNwRSxtRUFBbUU7QUFFcEQsU0FBZSxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQWUsRUFBRSxPQUFtQjtJQUFuQixxQ0FBbUI7Ozs7O3dCQUN6RSxxQkFBTSxLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQzs7b0JBQXBDLFFBQVEsR0FBRyxTQUF5QjtvQkFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7d0JBQ1IsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ3hDLElBQUksYUFBYSxHQUFHLENBQUM7NEJBQUUsc0JBQU8sY0FBYyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsYUFBYSxHQUFHLENBQUMsQ0FBQzt3QkFDN0UsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztxQkFDbkM7eUJBQU07d0JBQ0gsc0JBQU8sUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDO3FCQUMxQjs7Ozs7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7OztBQ3pCRCxjQUFjO0FBRWQsbUNBQW1DO0FBQ1U7QUFFOUIsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFtQztJQUFuQyw4QkFBd0IscURBQU0sQ0FBQyxJQUFJO0lBQzFFLElBQU0sTUFBTSxHQUFHLFVBQUcsSUFBSSxNQUFHLENBQUM7SUFDMUIsSUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFELElBQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1QyxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNuRTtLQUNGO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25CRCxjQUFjO0FBRWQsbUNBQW1DO0FBQ1U7QUFDRDtBQUU3QixTQUFTLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxNQUFvRztJQUFwRyx1RkFBb0c7SUFDNUosSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsdURBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0YsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDO0lBQzlDLElBQU0sTUFBTSxHQUFHLG9CQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUUsQ0FBQztJQUMvRyxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQVksTUFBTSxDQUFDLE1BQU0sQ0FBRSxDQUFDO0lBQzFELElBQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3RCxJQUFNLFVBQVUsR0FBRyxVQUFHLE1BQU0sQ0FBQyxJQUFJLGNBQUksZ0JBQWdCLFNBQUcsTUFBTSxvQkFBVSxNQUFNLENBQUMsSUFBSSxTQUFHLE1BQU0sU0FBRyxNQUFNLENBQUUsQ0FBQztJQUV4RyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFDdEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2ZELGtDQUFrQztBQWVMO0FBQ2tDO0FBQ25CO0FBQ0E7QUFDNUM7Ozs7R0FJRztBQUNJLFNBQVMsVUFBVTtJQUN4QixPQUFPLENBQ0wsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDN0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksU0FBUyxTQUFTO0lBQ3ZCLE9BQU8sQ0FDTCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksU0FBUyxRQUFRO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLFNBQVMsVUFBVTtJQUN4QixPQUFPLENBQ0wsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzNDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxTQUFTLFdBQVc7SUFDekIsSUFBSSxTQUFTLEVBQUUsRUFBRTtRQUNmLE9BQU8sc0RBQU8sQ0FBQztLQUNoQjtJQUNELElBQUksVUFBVSxFQUFFLEVBQUU7UUFDaEIsT0FBTyx1REFBUSxDQUFDO0tBQ2pCO0lBQ0QsSUFBSSxRQUFRLEVBQUUsRUFBRTtRQUNkLE9BQU8scURBQU0sQ0FBQztLQUNmO0lBQ0QsT0FBTyxtREFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxTQUFTLFNBQVM7SUFDdkIsSUFBTSxrQkFBa0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLElBQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1FBQy9DLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVE7UUFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLHFDQUFxQztJQUNyQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsSUFDRSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQzVCLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdkQ7UUFDQSxTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQ2xCO0lBQ0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLFNBQVMsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNqQyxJQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFPLElBQUksc0JBQW1CLENBQUMsQ0FBQztJQUN6RCxJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUlEOzs7Ozs7R0FNRztBQUNJLFNBQVMsWUFBWTtJQUMxQixJQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztJQUNsQixJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ1AsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFO1lBQzFDLElBQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxLQUFLLEVBQUU7Z0JBQUUsT0FBTyxPQUFPLENBQUM7WUFDbkMsT0FBTyxPQUFPLENBQUM7U0FDaEI7UUFDRCxPQUFPLE9BQU8sQ0FBQztLQUNoQjtJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFHRDs7O0dBR0c7QUFDSSxTQUFTLGlCQUFpQjtJQUMvQixJQUFNLFlBQVksR0FBRztRQUNuQixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLElBQUksRUFBRSxTQUFTLEVBQUU7UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxhQUFhLEVBQUUsT0FBTztRQUN0QixTQUFTLEVBQUUsbUJBQW1CO1FBQzlCLE9BQU8sRUFBRTtZQUNQLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUU7WUFDbEIsa0JBQWtCLEVBQUUsSUFBSTtTQUN6QjtLQUNGLENBQUM7SUFDRixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksU0FBUyxJQUFJOztJQUNsQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7SUFDakIsSUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtJQUN0RixJQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLG1DQUFtQztJQUMxRixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVywwQ0FBRSxJQUFJLDBDQUFFLFFBQVEsQ0FBQztRQUNuRSxDQUFDLENBQUMsd0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsMENBQUUsVUFBVSwwQ0FBRSxJQUFJLDBDQUFFLEVBQUU7UUFDM0QsQ0FBQyxDQUFDLGtCQUFDLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVywwQ0FBRSxJQUFJLDBDQUFFLFFBQXlELDBDQUFFLFVBQVUsMENBQUUsSUFBSSwwQ0FBRSxFQUFFLENBQUM7SUFDaEgsSUFBSSxZQUFZLElBQUksVUFBVTtRQUFFLElBQUksR0FBRyxJQUFJLENBQUM7SUFDNUMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLFNBQVMsU0FBUztJQUN2QixJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLEtBQUssTUFBTSxDQUFDO0lBRW5ELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxJQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFJLEdBQUcsS0FBSyxFQUFFO1lBQUUsT0FBTyxzQkFBZSxHQUFHLDRCQUF5QixDQUFDO1FBQ25FLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRCxPQUFPLHVCQUF1QixDQUFDO0tBQ2xDO0lBRUQsUUFBUSxXQUFXLEVBQUUsRUFBRTtRQUNyQixLQUFLLG1EQUFJO1lBQ1AsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsT0FBTywrQkFBK0IsQ0FBQzthQUN4QztZQUVELElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN0RSxPQUFPLGdEQUFnRCxDQUFDO2FBQ3pEO1lBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLE9BQU8sZ0RBQWdELENBQUM7YUFDekQ7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsMkRBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLDJEQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDMUQsT0FBTyxzQkFBZSwyREFBWSxDQUFDLENBQUMsQ0FBQywyQkFBd0IsQ0FBQztpQkFDL0Q7YUFDRjtZQUNELE9BQU8sc0JBQWUscURBQU0sQ0FBQyxJQUFJLGtDQUErQixDQUFDO1FBRW5FLEtBQUssc0RBQU87WUFDVixJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFNLFFBQVEsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLHlCQUFrQixRQUFRLENBQUUsQ0FBQzthQUNyQztpQkFBTTtnQkFDRyxJQUFVLEVBQUUsR0FBSyxNQUFNLENBQUMsUUFBUSxTQUFwQixDQUFxQjtnQkFDakMsUUFBSSxHQUFVLHFEQUFNLEtBQWhCLEVBQUUsR0FBRyxHQUFLLHFEQUFNLElBQVgsQ0FBWTtnQkFFN0IsSUFBTSxhQUFhLEdBQ2pCLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNsQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBQ25CLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXRCLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDaEMsT0FBTyxvQ0FBb0MsQ0FBQztnQkFDOUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO29CQUNoQyxPQUFPLG9DQUFvQyxDQUFDO2dCQUM5QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO29CQUFFLE9BQU8sOEJBQThCLENBQUM7Z0JBQ3hFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7b0JBQUUsT0FBTyw4QkFBOEIsQ0FBQztnQkFDeEUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO29CQUNwQyxPQUFPLG9DQUFvQyxDQUFDO2dCQUM5QyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7b0JBQ3BDLE9BQU8sb0NBQW9DLENBQUM7Z0JBRTlDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDbEMsT0FBTyw0QkFBNEIsQ0FBQztnQkFFdEMsSUFBSSxhQUFhO29CQUFFLE9BQU8seUJBQWtCLElBQUksWUFBUyxDQUFDO2dCQUMxRCxPQUFPLHlCQUFrQixHQUFHLFlBQVMsQ0FBQzthQUN2QztRQUNILEtBQUssdURBQVE7WUFDWCxJQUFJLE1BQU0sRUFBRTtnQkFDVixPQUFPLCtCQUErQixDQUFDO2FBQ3hDO1lBQ0QsZ0RBQWdEO1lBQ2hELElBQU0sTUFBTSxHQUNWLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxxREFBTSxDQUFDLElBQUk7Z0JBQ2IsQ0FBQyxDQUFDLHFEQUFNLENBQUMsR0FBRyxDQUFDO1lBQ2pCLE9BQU8sc0JBQWUsTUFBTSxrQ0FBK0IsQ0FBQztRQUU5RCxLQUFLLHFEQUFNO1lBQ1QsZ0RBQWdEO1lBQ2hELElBQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xELElBQUksU0FBUyxLQUFLLEVBQUUsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN4RSxPQUFPLHNCQUFlLHFEQUFNLENBQUMsR0FBRyxrQ0FBK0IsQ0FBQztRQUNsRTtZQUNFLE9BQU8sc0JBQWUscURBQU0sQ0FBQyxJQUFJLGtDQUErQixDQUFDO0tBQ3BFO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksU0FBUyxVQUFVLENBQUMsR0FBVztJQUNwQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtRQUMzQixLQUFLLElBQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUNyQixpREFBaUQ7WUFDakQsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztTQUMzQztRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLFNBQVMsVUFBVSxDQUFDLEdBQVU7SUFDbkMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0ksU0FBUyxhQUFhLENBQUMsR0FBd0I7SUFDcEQsSUFBTSxjQUFjLEdBQ2xCLFdBQVcsRUFBRSxLQUFLLG1EQUFJLENBQUMsQ0FBQyxDQUFDLG1FQUFvQixDQUFDLENBQUMsQ0FBQyxpRUFBa0IsQ0FBQztJQUNyRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QyxJQUNFLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7WUFDL0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFDN0I7WUFDQSxPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQjtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksU0FBUyxZQUFZLENBQUMsR0FBVyxFQUFFLEdBQVc7SUFDbkQsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtRQUM5QixHQUFHO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELEdBQUcsWUFBQyxRQUFRO1lBQ1YsZUFBZSxDQUFDLENBQUMsRUFBRSx3QkFBd0IsRUFBRSxvQkFBYSxRQUFRLENBQUUsQ0FBQyxDQUFDO1lBRXRFLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDcEIsNkNBQTZDO1lBQzdDLElBQUksR0FBRyxLQUFLLGVBQWU7Z0JBQUUsR0FBRyxHQUFHLG1FQUFvQixDQUFDO1lBQ3hELDJFQUFvQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUNEOzs7O0dBSUc7QUFDSSxTQUFTLGtCQUFrQjtJQUNoQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ3RCLElBQUksVUFBVSxHQUNaLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLFVBQVUsRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsMENBQTBDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEtBQUssOERBQWU7WUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLCtEQUFnQixDQUFDLENBQUM7S0FDN0U7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLElBQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUV6RCxJQUNFLEtBQUssSUFBSSxJQUFJO1FBQ2IsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2hCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7UUFDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ25CO1FBQ0EsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakI7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNJLFNBQVMsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxJQUFNLFdBQVcsR0FBRztRQUNsQiw0Q0FBNEM7UUFDNUMscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQixlQUFlO1FBQ2YsZUFBZTtRQUNmLHFCQUFxQjtRQUNyQixxQkFBcUI7UUFDckIsUUFBUTtRQUNSLGlCQUFpQjtLQUNsQixDQUFDO0lBRUYsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDaEUsT0FBTyxtQkFBbUIsQ0FBQztJQUU3QixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFHLElBQUssVUFBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksU0FBUyxnQkFBZ0I7SUFDOUIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyx1QkFBdUIsRUFBRTtRQUN0RCxPQUFPLFdBQVcsQ0FBQztLQUNwQjtJQUNELE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxTQUFTLGFBQWEsQ0FBQyxTQUFpQixFQUFFLE9BQWdCO0lBQy9ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0ksU0FBUyxjQUFjLENBQUMsU0FBaUIsRUFBRSxPQUFnQjtJQUNoRSxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSSxTQUFTLGdCQUFnQjtJQUM5QixJQUFJLE1BQU0sQ0FBQyxpQkFBaUI7UUFBRSxPQUFPO0lBQ3JDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNsQixNQUFNLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHO2FBQ3pELG9CQUFvQixDQUFDLE1BQU07WUFDNUIsQ0FBQyxDQUFDLE1BQU07WUFDUixDQUFDLENBQUMsU0FBUyxDQUFDO0tBQ2Y7U0FBTTtRQUNMLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7S0FDdEM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxTQUFTLGVBQWUsQ0FDN0IsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsSUFBK0I7SUFFL0IsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEtBQUssTUFBTTtRQUFFLE9BQU87SUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDakIsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7S0FDdEM7SUFFRCxJQUFNLGNBQWMsR0FBRztRQUNyQixDQUFDLEVBQUUsTUFBTTtRQUNULENBQUMsRUFBRSxNQUFNO1FBQ1QsQ0FBQyxFQUFFLE9BQU87S0FDWCxDQUFDO0lBRUYsSUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXZDLElBQU0sUUFBUSxHQUFHO1FBQ2YsU0FBUztRQUNULElBQUk7S0FDTCxDQUFDO0lBRUYsSUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFO1FBQ3JCLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsY0FBYyxDQUFDLCtCQUF3QixTQUFTLENBQUUsQ0FBQyxDQUFDO1FBQzVELHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxRQUFFLEtBQUssU0FBRSxDQUFDLENBQUM7UUFDOUIsc0NBQXNDO1FBQ3RDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNwQjtJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFFLFFBQVEsWUFBRSxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU07QUFDTixtQkFBbUI7QUFDbkIsNENBQTRDO0FBQzVDLHVCQUF1QjtBQUN2QixNQUFNO0FBQ04sdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFDN0Msc0RBQXNEO0FBQ3RELHVFQUF1RTtBQUV2RSxnREFBZ0Q7QUFDaEQsaUNBQWlDO0FBQ2pDLG9DQUFvQztBQUNwQyxnQkFBZ0I7QUFDaEIsZ0RBQWdEO0FBRWhELEtBQUs7QUFFTCxNQUFNO0FBQ04saUJBQWlCO0FBQ2pCLHdDQUF3QztBQUN4Qyx1QkFBdUI7QUFDdkIsTUFBTTtBQUNOLGlFQUFpRTtBQUNqRSx5RUFBeUU7QUFDekUsNkNBQTZDO0FBQzdDLHNEQUFzRDtBQUN0RCx1RUFBdUU7QUFDdkUsNENBQTRDO0FBQzVDLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEMsZ0JBQWdCO0FBQ2hCLCtCQUErQjtBQUMvQixLQUFLO0FBRUUsSUFBTSxTQUFTLEdBQUcsVUFBQyxZQUE0QjtJQUE1Qiw4Q0FBZSxNQUFNLENBQUMsTUFBTTtJQUNwRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBQ0Y7OztHQUdHO0FBQ0ksU0FBUyxPQUFPO0lBQ3JCLElBQU0sSUFBSSxHQUFHLHVEQUFnQixDQUFDLDBEQUFXLENBQUMsQ0FBQztJQUMzQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwQixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0ksU0FBUyxTQUFTOztJQUN2QixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7UUFDMUMsSUFBTSxXQUFTLEdBQUcsZ0JBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywwQ0FBRSxNQUFNLDBDQUNqRSxTQUFTLENBQUM7UUFDZCxJQUFJLFdBQVMsRUFBRTtZQUNiLHVEQUFnQixDQUNkLEVBQUUsU0FBUyxlQUFFLEVBQ2I7Z0JBQ0UsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLElBQUksRUFBRSxHQUFHO2FBQ1YsQ0FDRixDQUFDO1NBQ0g7S0FDRjtBQUNILENBQUM7QUFFTSxTQUFTLFdBQVc7SUFDekIsSUFBTSxZQUFZLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUMzRSxJQUFNLGtCQUFrQixHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxJQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsSUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekMsSUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsRCxJQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQyxFQUMxRTtRQUNBLFFBQVEsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUM5QztJQUNELElBQU0sb0JBQW9CLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLFNBQVM7UUFDekQsYUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUExQyxDQUEwQyxDQUMzQyxDQUFDO0lBQ0YsSUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN4RCxJQUFJLGVBQWUsSUFBSSxRQUFRLEVBQUU7UUFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7S0FDeEQ7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxTQUFTLGlCQUFpQjtJQUMvQixJQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNoRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDeEQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxbEJELGNBQWM7QUFFZCx5Q0FBeUM7QUFJWjtBQUtHO0FBRWhDOzs7Ozs7O0dBT0c7QUFDWSxTQUFTLHlCQUF5QixDQUFDLFNBQWlCLEVBQUUsRUFBK0I7UUFBN0IsT0FBTztJQUM1RSxxRUFBZSxDQUFDLENBQUMsRUFBRSxxRUFBc0IsRUFBRSxFQUFFLE9BQU8sV0FBRSxDQUFDLENBQUM7SUFDeEQsSUFBSTtRQUNGLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSwrREFBUyxFQUFFLEVBQUU7WUFDZixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbEI7UUFDRCwrR0FBK0c7UUFDL0csUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hCLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztLQUN4RDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsb0NBQW9DLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBRyw0REFBYSxvQkFBVSxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQ3pILHdFQUFrQixFQUFFLENBQUM7S0FDdEI7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDRCxjQUFjO0FBRWQsb0JBQW9CO0FBQ3BCLG1DQUFtQztBQUlOO0FBSUc7QUFFaEM7Ozs7OztHQU1HO0FBQ0gsNkJBQWUsb0NBQVUsU0FBaUIsRUFBRSxhQUF5QztJQUNuRixJQUFJO1FBQ0YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsZ0NBQWdDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O1lBQ3BCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQzdDLENBQUMsQ0FBQztZQUNJLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQUUsT0FBTztZQUNqQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQXNCLENBQUM7WUFBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN0RSxDQUFDLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsUUFBRSxDQUFDLFVBQVUsMENBQUUsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7WUFDNUIsR0FBRyxFQUFFLFVBQUcsYUFBYSxDQUFDLGNBQWMsa0JBQWU7WUFDbkQsS0FBSyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1NBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsTUFBTSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUM7UUFDaEMsYUFBYSxDQUFDLE9BQU8sQ0FBQywwRUFBMkIsRUFBRSxhQUFhLENBQUMsQ0FBQztLQUNuRTtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YscUVBQWUsQ0FBQyxDQUFDLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBRyw0REFBYSxvQkFBVSxDQUFDLENBQUUsQ0FBQyxDQUFDO1FBQ3pILHdFQUFrQixFQUFFLENBQUM7S0FDdEI7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekNELGNBQWM7QUFDZCw0Q0FBNEM7QUFNWjtBQUNxQztBQUVyRTs7OztHQUlHO0FBQ1ksU0FBUyx1QkFBdUIsQ0FBQyxPQUF3QztJQUN0RixJQUFNLEVBQUUsR0FBRywwREFBSSxFQUFFLENBQUM7SUFDbEIsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDLFVBQVUsQ0FBQztJQUNwRCxJQUFNLGFBQWEsR0FBRyxrRUFBWSxFQUFFLENBQUM7SUFDckMsSUFBTSxVQUFVLEdBQUcsc0VBQWdCLEVBQUUsQ0FBQztJQUN0QyxvRUFBYyxDQUFDLDZFQUE4Qix3QkFDdEMsT0FBTyxDQUFDLE1BQU07UUFDakIsbUNBQW1DO1FBQ25DLGNBQWMsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLElBRXBHLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCRCxjQUFjO0FBQ2QsK0NBQStDO0FBS2xCO0FBUUc7QUFFaEM7Ozs7R0FJRztBQUNJLFNBQVMsMEJBQTBCLENBQUMsbUJBQTRCO0lBQ3JFLGFBQWEsQ0FBQyxPQUFPLENBQUMsZ0ZBQWlDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUM5RSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUTtRQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxVQUFHLDREQUFhLG9CQUFVLG1CQUFtQixDQUFFLENBQUMsQ0FBQztJQUMzSSxxRUFBZSxDQUFDLENBQUMsRUFBRSx5QkFBeUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25FLHdFQUFrQixFQUFFLENBQUM7SUFDckIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsNkJBQWUsb0NBQVUsU0FBYyxFQUFFLE9BQWtGO0lBQ3pILElBQUk7UUFFQSxVQUFNLEdBQ0osT0FBTyxPQURILEVBQUUsWUFBWSxHQUNsQixPQUFPLGFBRFcsRUFBRSxNQUFNLEdBQzFCLE9BQU8sT0FEbUIsRUFBRSxPQUFPLEdBQ25DLE9BQU8sUUFENEIsQ0FDM0I7UUFDWixJQUFNLGFBQWEsR0FBRyxrRUFBWSxFQUFFLENBQUM7UUFDckMsSUFBTSxFQUFFLEdBQUcsMERBQUksRUFBRSxDQUFDO1FBQ2xCLElBQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUNyRCxJQUFNLFVBQVUsR0FBRyxzRUFBZ0IsRUFBRSxDQUFDO1FBQ3RDLG1DQUFtQztRQUNuQyxJQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDeEcsSUFBTSxrQkFBa0IsR0FBRyxVQUFHLFNBQVMsMENBQWdDLE1BQU0sMkJBQWlCLFlBQVkscUJBQVcsTUFBTSxzQkFBWSxPQUFPLENBQUUsQ0FBQztRQUNqSixxRUFBZSxDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxLQUFLLENBQUMsa0JBQWtCLEVBQUU7WUFDeEIsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjthQUNuQztZQUNELFdBQVcsRUFBRSxTQUFTO1NBQ3ZCLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxPQUFPLENBQUMseUVBQTBCLENBQUMsQ0FBQztLQUNuRDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QscUVBQWUsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbkM7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0RELGNBQWM7QUFFZCxvQ0FBb0M7QUFFcEM7OztHQUdHO0FBQ0ksSUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztBQUNwRCxJQUFNLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0FBQ3hELElBQU0sMEJBQTBCLEdBQUcsNEJBQTRCLENBQUM7QUFDaEUsSUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUN4RCxJQUFNLHFCQUFxQixHQUFHLHVCQUF1QixDQUFDO0FBQ3RELElBQU0sc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFDeEQsSUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRDs7O0dBR0c7QUFDSSxJQUFNLDJCQUEyQixHQUFHLDZCQUE2QixDQUFDO0FBQ2xFLElBQU0sOEJBQThCLEdBQUcsZ0NBQWdDLENBQUM7QUFFL0U7OztHQUdHO0FBQ0ksSUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxJQUFNLGlDQUFpQyxHQUFHLG1DQUFtQyxDQUFDO0FBQzlFLElBQU0saUNBQWlDLEdBQUcsbUNBQW1DLENBQUM7QUFFckY7OztHQUdHO0FBQ0ksSUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztBQUM1QyxJQUFNLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0FBQ2hELElBQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7QUFDNUMsSUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDeEMsSUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDeEMsSUFBTSxtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztBQUNsRCxJQUFNLHFCQUFxQixHQUFHLHVCQUF1QixDQUFDO0FBQ3RELElBQU0sZUFBZSxHQUFHLGlCQUFpQixDQUFDO0FBQzFDLElBQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSSxJQUFNLDZCQUE2QixHQUFHLCtCQUErQixDQUFDO0FBQ3RFLElBQU0sOEJBQThCLEdBQUcsZ0NBQWdDLENBQUM7QUFFL0U7OztHQUdHO0FBQ0ksSUFBTSxxQkFBcUIsR0FBRyx1QkFBdUIsQ0FBQztBQUN0RCxJQUFNLHNCQUFzQixHQUFHLHdCQUF3QixDQUFDO0FBRS9EOzs7R0FHRztBQUNJLElBQU0sa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7QUFDaEQsSUFBTSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNoRCxJQUFNLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDO0FBQ2xELElBQU0sNEJBQTRCLEdBQUcsOEJBQThCLENBQUM7QUFDcEUsSUFBTSxtQkFBbUIsR0FBRyx5Q0FBeUMsQ0FBQztBQUN0RSxJQUFNLGtDQUFrQyxHQUFHLG9DQUFvQyxDQUFDO0FBQ2hGLElBQU0sdUNBQXVDLEdBQUcseUNBQXlDLENBQUM7QUFFakc7Ozs7R0FJRztBQUNJLElBQU0sNkJBQTZCLEdBQUcsK0JBQStCO0FBQ3JFLElBQU0scUNBQXFDLEdBQUcsdUNBQXVDO0FBQ3JGLElBQU0scUNBQXFDLEdBQUcsdUNBQXVDO0FBQ3JGLElBQU0saUNBQWlDLEdBQUcsMEJBQTBCLENBQUM7QUFDckUsSUFBTSw4QkFBOEIsR0FBRyx5QkFBeUIsQ0FBQztBQUNqRSxJQUFNLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDO0FBQ2xELElBQU0sd0JBQXdCLEdBQUcsMEJBQTBCLENBQUM7QUFFbkU7OztHQUdHO0FBQ0ksSUFBTSwyQkFBMkIsR0FBRyw2QkFBNkIsQ0FBQztBQUVsRSxJQUFNLG1DQUFtQyxHQUFHLHFDQUFxQyxDQUFDO0FBQ2xGLElBQU0sb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7QUFFM0Q7OztHQUdHO0FBQ0ksSUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxJQUFNLGlDQUFpQyxHQUFHLG1DQUFtQyxDQUFDO0FBQzlFLElBQU0saUNBQWlDLEdBQUcsbUNBQW1DLENBQUM7QUFFOUUsSUFBTSxjQUFjLEdBQUc7SUFDNUIsU0FBUyxFQUFFLFNBQVM7Q0FDckIsQ0FBQztBQUVGOzs7R0FHRztBQUNJLElBQU0sYUFBYSxHQUFHLG9FQUFvRSxDQUFDO0FBRWxHOzs7R0FHRztBQUNJLElBQU0sY0FBYyxHQUFHLCtCQUErQixDQUFDO0FBQ3ZELElBQU0scUJBQXFCLEdBQUcsc0NBQXNDLENBQUM7QUFHNUU7OztHQUdHO0FBQ0ksSUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBRXJDOzs7R0FHRztBQUNJLElBQU0sMEJBQTBCLEdBQUcsNEJBQTRCLENBQUM7QUFFdkU7Ozs7R0FJRztBQUNJLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMxQixJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDNUIsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ3BCLElBQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUN4QixJQUFNLFlBQVksR0FBRztJQUMxQixPQUFPO0lBQ1AsUUFBUTtJQUNSLE9BQU87SUFDUCxPQUFPO0lBQ1AsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sT0FBTztJQUNQLFFBQVE7SUFDUixRQUFRO0lBQ1IsTUFBTTtJQUNOLE1BQU07SUFDTixXQUFXO0lBQ1gsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsYUFBYTtJQUNiLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osWUFBWTtJQUNaLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGNBQWM7SUFDZCxhQUFhO0lBQ2IsY0FBYztDQUNmLENBQUM7QUFDSyxJQUFNLE1BQU0sR0FBRztJQUNwQixHQUFHLEVBQUUsTUFBTTtJQUNYLElBQUksRUFBRSxPQUFPO0NBQ2QsQ0FBQztBQUVGOzs7R0FHRztBQUNJLElBQU0sa0JBQWtCLEdBQUc7SUFDaEMsbUJBQW1CO0lBQ25CLDRCQUE0QjtJQUM1Qix1QkFBdUI7Q0FDeEIsQ0FBQztBQUNLLElBQU0sb0JBQW9CLEdBQUc7SUFDbEMsZUFBZTtDQUNoQixDQUFDO0FBQ0ssSUFBTSxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztBQUNqRCxJQUFNLE1BQU0sR0FBRztJQUNwQixJQUFJLEVBQUUsVUFBVTtJQUNoQixVQUFVLEVBQUUsRUFBRTtJQUNkLE1BQU0sRUFBRSxvQkFBb0I7SUFDNUIsTUFBTSxFQUFFLElBQUk7SUFDWixJQUFJLEVBQUUsR0FBRztDQUNWLENBQUM7QUFFRjs7R0FFRztBQUNJLElBQU0sV0FBVyxHQUFHO0lBQ3pCLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLG9CQUFvQjtJQUM1QixNQUFNLEVBQUUsSUFBSTtJQUNaLElBQUksRUFBRSxHQUFHO0NBQ1YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hORjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxxQkFBTSxvQkFBb0IscUJBQU07QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUVELHFCQUFxQixFQUFFLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUYsQ0FBQyxjQUFNLHdCQUFpQixFQUFFLEVBQW5CLENBQW1CLENBQUMsRUFBRSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvdXRpbGl0aWVzL2xvZ2dlci5qcyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvcHVic3ViL2FkZC1wdWItc3ViLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9ib290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvcHVic3ViL3BsYWNlaG9sZGVyLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9wb3N0LW1lc3NhZ2VzLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9wdWItc3ViLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi9zdWJzY3JpcHRpb25zLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3B1YnN1Yi93aWRnZXQtc2NyaXB0LWxvYWRlZC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9wdWJzdWIvd2lkZ2V0LXNjcmlwdC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9mZXRjaC1yZWZJRC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9nZW5lc3lzLWRhdGEudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvc2FsZXMvZ3JhYi1kYXRhLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3NhbGVzL2hlYXJ0YmVhdC50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9yZXF1ZXN0LXRjLXVwZGF0ZS50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vc3JjL3dpZGdldC9zYWxlcy9yZXF1ZXN0LnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3NhbGVzL3Jlc3BvbnNlLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9mZXRjaC13aXRoLXJldHJ5LnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9nZXQtY29va2llLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy9zZXQtY29va2llLnRzIiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L3V0aWxpdGllcy91dGlsaXRpZXMudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9hZ2VudC1pbmNlbnRpdmUudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9jby1icm93c2UudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9jb25maWd1cmUtY29icm93c2UudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWFwaS9zZW5kLWRpc3Bvc2l0aW9uLWNvZGUudHMiLCJ3ZWJwYWNrOi8vY2hhdC8uL3NyYy93aWRnZXQvd2lkZ2V0LWNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9jaGF0Ly4vbm9kZV9tb2R1bGVzL3doYXR3Zy1mZXRjaC9mZXRjaC5qcyIsIndlYnBhY2s6Ly9jaGF0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2NoYXQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2NoYXQvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9jaGF0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vY2hhdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2NoYXQvLi9zcmMvd2lkZ2V0L2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IEFDU19MT0dHRVJfVVJMIH0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvZ0dlbmVzeXNFdmVudCB9IGZyb20gXCIuL3V0aWxpdGllc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtb2JpbGVBQ1NMb2dnZXJTZXJ2aWNlKGxhYmVsLCBlcnJvcikge1xuICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ3NlY3VyZScpKSB7XG4gICAgaWYgKCF3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IpIHJldHVybjtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdDbGllbnQgTG9nZ2VyIGZpcmVkJywgZXJyb3IpXG4gICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgXCJwYXlsb2FkXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibG9nTGV2ZWxcIjogXCJkZWJ1Z1wiLFxuICAgICAgICAgIFwiZW50cnlcIjogYGxhYmVsOiAke2xhYmVsfSB8IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCAgICAgICAgICBcbiAgICAgICAgfSxcbiAgICAgIF1cbiAgICB9XG4gICAgY29uc3QgZG9tYWluID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbi5yZXBsYWNlKCdzZWN1cmUnLCAnbXNlcnZpY2UnKVxuICAgIGNvbnN0IGVycm9yVVJMID0gYCR7ZG9tYWlufSR7QUNTX0xPR0dFUl9VUkx9YDsgICBcbiAgICBmZXRjaChlcnJvclVSTCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGVycm9yUGF5bG9hZCksXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZSdcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH0pO1xuICAgIH07XG59OyIsIi8vIEB0cy1ub2NoZWNrXG4vKiogQG1vZHVsZSBiYXNlL2V2ZW50cyAqL1xuXG5pbXBvcnQge1xuICBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04sXG4gIEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsXG4gIE1PTklUT1JJTkdKU19SRVFVRVNULFxuICBNT05JVE9SSU5HSlNfSEVBUlRCRUFULFxuICBHRU5FU1lTX1FVQUxJRklFRF9MRUFELFxuICBDQU5DRUxfU0lURV9TVUJTLFxuICBDSEVDS19BSF9UT0tFTixcbiAgR1JBQl9IRUFSVEJFQVRfREFUQSxcbiAgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURSxcbiAgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULFxuICBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTixcbiAgR0VORVNZU19TRVRfQUdFTlRfSUQsXG59IGZyb20gXCIuL3dpZGdldC1jb25zdGFudHNcIjtcblxuaW1wb3J0IGdlbmVzeXNDb2Jyb3dzZSBmcm9tIFwiLi93aWRnZXQtYXBpL2NvLWJyb3dzZVwiO1xuaW1wb3J0IHNlbmREaXNwb3NpdGlvbkNvZGUgZnJvbSBcIi4vd2lkZ2V0LWFwaS9zZW5kLWRpc3Bvc2l0aW9uLWNvZGVcIjtcbmltcG9ydCBnZW5lc3lzQWdlbnRRdWFsaWZpZWRMZWFkIGZyb20gXCIuL3dpZGdldC1hcGkvYWdlbnQtaW5jZW50aXZlXCI7XG5pbXBvcnQgbW9uaXRvcmluZ1JlcXVlc3QgZnJvbSBcIi4vc2FsZXMvcmVxdWVzdFwiO1xuaW1wb3J0IG1vbml0b3JpbmdIZWFydGJlYXQgZnJvbSBcIi4vc2FsZXMvaGVhcnRiZWF0XCI7XG5pbXBvcnQge1xuICBwb3N0TmF0aXZlQ2hhdFVwZGF0ZSxcbiAgcG9zdFRvQ2FuY2VsU3Vic09uU2l0ZSxcbiAgcG9zdFRvQ2hlY2tBSFRva2VuLFxuICBwb3N0Q2hhdERldGFpbHMsXG59IGZyb20gXCIuL3B1YnN1Yi9wb3N0LW1lc3NhZ2VzXCI7XG5pbXBvcnQgeyBncmFiSGVhcnRiZWF0RGF0YSB9IGZyb20gXCIuL3NhbGVzL3Jlc3BvbnNlXCI7XG5pbXBvcnQgeyBsb2dHZW5lc3lzRXZlbnQgfSBmcm9tIFwiLi91dGlsaXRpZXMvdXRpbGl0aWVzXCI7XG5cbmltcG9ydCByZXF1ZXN0VGNVcGRhdGUgZnJvbSBcIi4vc2FsZXMvcmVxdWVzdC10Yy11cGRhdGVcIjtcbmltcG9ydCBmZXRjaFJlZklEIGZyb20gXCIuL3NhbGVzL2ZldGNoLXJlZklEXCI7XG5sZXQgYWhfdG9rZW5SZWNlaXZlZCA9IGZhbHNlO1xubGV0IHJlZklEUmVxdWVzdFJlY2VpdmVkID0gZmFsc2U7XG5sZXQgcmVmSURFdmVudERhdGE6IHsgdGl0bGU6IHN0cmluZzsgZGV0YWlsOiBhbnkgfSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbi8vIE5lZWQgdG8gdXBkYXRlIGZvciBmaW5hbCBzdWJtaXQgcGFnZS5cbmNvbnN0IHNob3VsZEZpcmVSZWZJRENoZWNrID0gKHJlcXVlc3RUeXBlOiBzdHJpbmcpID0+IHtcbiAgaWYgKHJlZklERXZlbnREYXRhKVxuICAgIHJldHVybiBmZXRjaFJlZklEKHJlZklERXZlbnREYXRhLnRpdGxlLCByZWZJREV2ZW50RGF0YS5kZXRhaWwpO1xuICByZXR1cm47XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemluZyBzdWJzY3JpcHRpb25zXG4gKiBAZGVzYyBJbml0aWFsaXplIHN1YnNjcmlwdGlvbnMuIFRoZXNlIHN1YnNjcmlwdGlvbnMgd2lsbCB3YWl0IG9uIHB1Ymxpc2hlcyBmcm9tIHRoZSB3aWRnZXRcbiAqIEBleGFtcGxlXG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9SRVFVRVNUX0RJU0NPTk5FQ1QsIGNvbWV0ZERpc2Nvbm5lY3QpO1xuXG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9OT1RJRllfU1RPUF9UWVBJTkcsIGNvbWV0ZFR5cGluZyk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9OT1RJRllfU1RBUlRfVFlQSU5HLCBjb21ldGRUeXBpbmcpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfTk9USUZZX1JFQURfUkVDRUlQVCwgY29tZXRkVHlwaW5nKTtcblxuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfUkVRVUVTVF9DSEFOTkVMLCBjb21ldGRSZXF1ZXN0Q2hhbm5lbCk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKENPTUVURF9SRVFVRVNUX1NFTkRfTUVTU0FHRSwgY29tZXRkU2VuZE1lc3NhZ2UpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDT01FVERfUkVRVUVTVF9DSEFOTkVMX1NVQlNDUklQVElPTiwgY29tZXRkU3Vic2NyaWJlQ2hhbm5lbCk7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoTU9OSVRPUklOR0pTX1JFUVVFU1QsIG1vbml0b3JpbmdSZXF1ZXN0KTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoTU9OSVRPUklOR0pTX0hFQVJUQkVBVCwgbW9uaXRvcmluZ0hlYXJ0YmVhdCk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdFTkVTWVNfUVVBTElGSUVEX0xFQUQsIGdlbmVzeXNBZ2VudFF1YWxpZmllZExlYWQpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04sIGdlbmVzeXNDb2Jyb3dzZSk7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsIHNlbmREaXNwb3NpdGlvbkNvZGUpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShDQU5DRUxfU0lURV9TVUJTLCBwb3N0VG9DYW5jZWxTdWJzT25TaXRlKTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoQ0hFQ0tfQUhfVE9LRU4sIHBvc3RUb0NoZWNrQUhUb2tlbik7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKEdSQUJfSEVBUlRCRUFUX0RBVEEsIGdyYWJIZWFydGJlYXREYXRhKTtcblxuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLCByZXF1ZXN0VGNVcGRhdGUpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsIHBvc3ROYXRpdmVDaGF0VXBkYXRlKTtcbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoXG4gICAgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT04sXG4gICAgKHRpdGxlOiBzdHJpbmcsIGRldGFpbDogb2JqZWN0IHwgc3RyaW5nKSA9PiB7XG4gICAgICByZWZJREV2ZW50RGF0YSA9IHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGRldGFpbCxcbiAgICAgIH07XG4gICAgICBzaG91bGRGaXJlUmVmSURDaGVjayhcIlJFRl9JRF9DSEVDS19SRUNFSVZFRFwiKTtcbiAgICB9XG4gICk7XG5cblxubG9nR2VuZXN5c0V2ZW50KDEsICdUZWFsaXVtUHViU3ViIFN1YnNjcmliaW5nJywgYHN1YnNjcmliaW5nOiAke01PTklUT1JJTkdKU19SRVFVRVNUfSwgJHtNT05JVE9SSU5HSlNfSEVBUlRCRUFUfSwgJHtHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT059LCAke0dXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREV9LCAke0dFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVH0sICR7R0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT059YCk7XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgcHVic3ViL2FkZC1wdWItc3ViICovXG5pbXBvcnQgcHViU3ViIGZyb20gJy4vcHViLXN1Yic7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVDaGF0RW52LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIEluIEJvcm5lbyB3ZSBuZWVkIHRvIGFkZCB0aGUgcHViIHNjcmlwdCBmaXJzdFxuICogV2lsbCBhcHBlbmQgbmV3bHkgY3JlYXRlZCBkaXYgdG8gZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIGRldGVybWluZUNoYXRFbnYoKTtcbiAgcHViU3ViKCk7XG4gIGxvZ0dlbmVzeXNFdmVudCgxLCAnUHViU3ViJywgJ2FkZGluZyBUZWFsaXVtUHViU3ViJyk7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHB1YnN1Yi9ib290c3RyYXAgKi9cblxuaW1wb3J0IHtcbiAgQ0hBVF9JTklUSUFMSVpBVElPTixcbiAgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTixcbiAgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9TVUNDRVNTRlVMLFxufSBmcm9tIFwiLi4vd2lkZ2V0LWNvbnN0YW50c1wiO1xuXG5pbXBvcnQgYWRkUHViU3ViIGZyb20gXCIuL2FkZC1wdWItc3ViXCI7XG5pbXBvcnQgc3Vic2NyaXB0aW9ucyBmcm9tIFwiLi9zdWJzY3JpcHRpb25zXCI7XG5pbXBvcnQgeyBnZXREb21haW4sIGlzU3BhbmlzaCwgd2hpY2hWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxpdGllcy91dGlsaXRpZXNcIjtcblxuYWRkUHViU3ViKCk7XG5UZWFsaXVtUHViU3ViLnN1YnNjcmliZShDSEFUX0lOSVRJQUxJWkFUSU9OLCAoKSA9PiB7XG4gIFRlYWxpdW1QdWJTdWIucHVibGlzaChXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OLCB7XG4gICAgc3Bpbm5lcjogdHJ1ZSxcbiAgICB2ZXJzaW9uOiB3aGljaFZlcnNpb24oKSxcbiAgICBjb250YWluZXI6IFwiY2hhdC1wbGFjZWhvbGRlclwiLFxuICAgIG5hbWU6IFwid3d3LWNoYXRcIixcbiAgICBsYW5ndWFnZTogaXNTcGFuaXNoKCksXG4gICAgcGF0aDogZ2V0RG9tYWluKCksXG4gICAgb3B0aW9uczogeyBza2lwQmFiZWxQb2x5RmlsbDogdHJ1ZSB9LFxuICB9KTtcbn0pO1xuXG5UZWFsaXVtUHViU3ViLnN1YnNjcmliZShXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX1NVQ0NFU1NGVUwsIHN1YnNjcmlwdGlvbnMpO1xuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgcHVic3ViL3BsYWNlaG9sZGVyICovXG5pbXBvcnQge1xuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIFdpbGwgY3JlYXRlIGRpdiBlbGVtZW50LCBhZGQgYXR0cmlidXRlIFwiY2hhdC1wbGFjZWhvbGRlclwiXG4gKiBXaWxsIGFwcGVuZCBuZXdseSBjcmVhdGVkIGRpdiB0byBkb2N1bWVudFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBib29sZWFuIHtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdQbGFjZWhvbGRlcicsICdhcHBlbmRpbmcgZGl2I2NoYXQtcGxhY2Vob2xkZXIgdG8gYm9keScpO1xuICBjb25zdCAkZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICRkaXYuaWQgPSAnY2hhdC1wbGFjZWhvbGRlcic7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoJGRpdik7XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKlxuICogUG9zdE1lc3NhZ2VzXG4gKiBUaGUgZm9sbG93aW5nIHNjcmlwdCBwcm92aWRlcyB0aGUgcG9zdCBtZXNzYWdlIHNjcmlwdHMgdGhhdCBwcm92aWRlIGNvbW11bmljYXRpb24gYmFjayBhbmQgZm9ydGhcbiAqIHdpdGggdGhlIHdpZGdldC4gQWxsIG9mIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGtlcHQgaW4gdGhpcyBmaWxlIGFuZCBub3Qgc2V0IGFzIGEgZnVuY3Rpb24gc28gdGhlXG4gKiBjb3VudGVycyB3aWxsIGJlIHJlbWVtYmVyZWQgYW5kIHN0b3JlZC5cbiAqXG4gKi9cbmltcG9ydCB7XG4gIEJPRkEsXG4gIEJPRkFfU0FMRV9JTkRJQ0FUT1JTLFxuICBDQU5DRUxfSEVBUlRCRUFULFxuICBDQU5DRUxfV0lER0VUX1NVQlMsXG4gIENBTkNFTF9TSVRFX1NVQlMsXG4gIEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HLFxuICBDSEVDS19BSF9UT0tFTixcbiAgQ0hFQ0tfRk9SX1NBTEUsXG4gIEdSQUJfSEVBUlRCRUFUX0RBVEEsXG4gIElOUV9DTElFTlRfT1JERVJfTlVNLFxuICBNTF9TQUxFX0lORElDQVRPUlMsXG4gIFNFVF9NT05JVE9SSU5HX1NUQVRVUyxcbiAgU0VORF9QUk9YWV9EQVRBLFxuICBTSVRFX0lORk9fQVZBSUxBQkxFLFxuICBjaGF0U2l0ZVBhcmFtcyxcbiAgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULFxuICBHRU5FU1lTX1NFVF9BR0VOVF9JRCxcbn0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGdldEN1cnJlbnREb21haW4sXG4gIGlzU2FsZVByZXNlbnQsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbiAgcXVlcnlTdHJpbmdQYXJzZSxcbiAgcHJveHlDaGF0RERPLFxuICB3aGljaERvbWFpbixcbiAgcHVibGlzaFdpbmRvdyxcbiAgaXNWNlxufSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuXG5sZXQgY2hhdFdpbmRvdzogV2luZG93IHwgbnVsbDtcbmxldCBjaGF0U2l0ZUhvc3QgPSBcIlwiO1xubGV0IHNpdGVJbmZvRmlyZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gdGVybWluYXRlR2VuZXN5c0NoYXQoKSB7XG4gIGxvZ0dlbmVzeXNFdmVudChcbiAgICAxLFxuICAgIFwiQ2FuY2VsIEFsbCBXaWRnZXQgU3Vic2NyaXB0aW9uc1wiLFxuICAgIFwiU3VzcGVuc2lvbiBvZiBNb25pdG9yaW5nIEhlYXJ0YmVhdCBFdmVudHMgYW5kIEFsbCBXaWRnZXQgU3Vic1wiXG4gICk7XG5cbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgVGVhbGl1bVB1YlN1Yi5jbGVhckFsbFN1YnNjcmlwdGlvbnMoKTtcbn1cblxuZnVuY3Rpb24gc2VuZFBvc3RNZXNzYWdlKGRhdGE6IHN0cmluZyB8IG9iamVjdCkge1xuICBpZiAoIWNoYXRTaXRlSG9zdCAmJiB3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IgPT09IFwibm90cHJvZFwiKSB7XG4gICAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gICAgY2hhdFNpdGVIb3N0ID0gdjYgPyBPYmplY3QudmFsdWVzKHNwYVdpZGdldFBhcmFtc1tcImd0LWNoYXQtd2lkZ2V0XCJdKVswXS5zaXRlUGFyYW1zLmRvbWFpbnNbZ2V0Q3VycmVudERvbWFpbigpXS5jaGF0U2l0ZUhvc3QgOiBPYmplY3QudmFsdWVzKHNwYVdpZGdldFBhcmFtc1tcInd3dy1jaGF0XCJdKVswXS5zaXRlUGFyYW1zXG4gICAgICAuZG9tYWluc1tnZXRDdXJyZW50RG9tYWluKCldLmNoYXRTaXRlSG9zdDtcbiAgfVxuICBpZiAoY2hhdFdpbmRvdykgY2hhdFdpbmRvdy5wb3N0TWVzc2FnZShkYXRhLCBjaGF0U2l0ZUhvc3QpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVQb3N0TWVzc2FnZShldmVudDogYW55KSB7XG4gIGNvbnN0IHY2ID0gaXNWNigpO1xuICBjb25zdCB3aWRnZXROYW1lID0gdjYgPyBcImd0LWNoYXQtd2lkZ2V0XCIgOiBcInd3dy1jaGF0XCI7XG4gIGlmIChldmVudC5kYXRhID09PSBcIkdFVF9RU19ERE9cIikge1xuICAgIGNvbnN0IGN1cnJlbnRUTEQgPSBnZXRDdXJyZW50RG9tYWluKCk7XG4gICAgY2hhdFdpbmRvdyA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXRXaW5kb3dcIikgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICA/LmNvbnRlbnRXaW5kb3c7XG4gICAgY2hhdFNpdGVIb3N0ID0gT2JqZWN0LnZhbHVlcyhzcGFXaWRnZXRQYXJhbXNbd2lkZ2V0TmFtZV0pWzBdLnNpdGVQYXJhbXNcbiAgICAgIC5kb21haW5zW2N1cnJlbnRUTERdLmNoYXRTaXRlSG9zdDtcbiAgICBjaGF0V2luZG93Py5wb3N0TWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgaHJlZjogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICAgIGRkbzogd2luZG93LmRpZ2l0YWxEYXRhLFxuICAgICAgICB0aXRsZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgfSxcbiAgICAgIGNoYXRTaXRlSG9zdFxuICAgICk7XG4gIH1cblxuICBpZiAoZXZlbnQuZGF0YSA9PT0gXCJBSF9DT09LSUVfU0VUXCIpIHtcbiAgICBwdWJsaXNoV2luZG93KFwiQUhfQ09PS0lFX1NFVFwiLCB7fSk7XG4gIH1cbiAgaWYgKGV2ZW50LmRhdGEuZXZlbnQgPT09IFwiY2hhdFByZVN1cnZleVZpZXdcIikge1xuICAgIHdpbmRvdy5kYXRhQ29sbGVjdG9yLnB1c2goZXZlbnQuZGF0YSk7XG4gIH1cblxuICBpZiAoZXZlbnQuZGF0YS51dGFnSW5pdCkge1xuICAgIGNvbnN0IHY2ID0gaXNWNigpO1xuICAgIGNvbnN0IHdpZGdldE5hbWUgPSB2NiA/IFwiZ3QtY2hhdC13aWRnZXRcIiA6IFwid3d3LWNoYXRcIjtcbiAgICBjb25zdCBjdXJyZW50VExEID0gZ2V0Q3VycmVudERvbWFpbigpO1xuICAgIGNoYXRXaW5kb3cgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGF0V2luZG93XCIpIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgPy5jb250ZW50V2luZG93O1xuICAgIGNoYXRTaXRlSG9zdCA9IE9iamVjdC52YWx1ZXMoc3BhV2lkZ2V0UGFyYW1zW3dpZGdldE5hbWVdKVswXS5zaXRlUGFyYW1zXG4gICAgICAuZG9tYWluc1tjdXJyZW50VExEXS5jaGF0U2l0ZUhvc3Q7XG4gICAgY29uc3Qgc2hvd0RlYnVnQ29uc29sZSA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJkZWJ1Z0NoYXRcIikgPT09IFwiMVwiO1xuICAgIC8vIHNldHRpbmcgY2hhdHNpdGUgc3BhUGFyYW1zIHRvIGxvY2FsIGt2cCBvbiB0aGUgd2lkZ2V0XG4gICAgY2hhdFNpdGVQYXJhbXMuc3BhUGFyYW1zID0gZXZlbnQ/LmRhdGE/LnNwYVBhcmFtcz8uc2l0ZVBhcmFtcz8uZG9tYWlucztcbiAgICAvLyB0cmlnZ2VyaW5nIHB1Yi9zdWIgdGhhdCBkYXRhIGZyb20gdGhlIGNoYXRzaXRlIGhhcyBiZWVuIHJlY2VpdmVkLlxuXG4gICAgY29uc3QgYmFjdG1Db29raWVzID0gbmV3IGJhY3RtLkNvb2tpZXMoKTtcbiAgICBjb25zdCBjb29raWVFeGlzdHMgPSBiYWN0bUNvb2tpZXMuZ2V0KFwib2NjdENoYXRcIik7XG4gICAgY29uc3Qgb2NjdENoYXRDb29raWUgPSBjb29raWVFeGlzdHMgPyBKU09OLnBhcnNlKGNvb2tpZUV4aXN0cykgOiBcIlwiO1xuICAgIGxldCBjaGF0UmVmSURGb3VuZCA9IG9jY3RDaGF0Q29va2llLmNoYXRSZWZJRFxuICAgICAgPyBvY2N0Q2hhdENvb2tpZS5jaGF0UmVmSURcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IGx0c0Nvb2tpZUV4aXN0cyA9IGJhY3RtQ29va2llcy5nZXQoXCJvY2N0Q2hhdF9sdHNcIik7XG4gICAgY29uc3Qgb2NjdENoYXRMdHNDb29raWUgPSBsdHNDb29raWVFeGlzdHNcbiAgICAgID8gSlNPTi5wYXJzZShsdHNDb29raWVFeGlzdHMpXG4gICAgICA6IFwiXCI7XG4gICAgbGV0IGFnZW50SURGb3VuZCA9IG9jY3RDaGF0THRzQ29va2llLnNlY3VyZUFnZW50SURcbiAgICAgID8gb2NjdENoYXRMdHNDb29raWUuc2VjdXJlQWdlbnRJRFxuICAgICAgOiBcIlwiO1xuICAgIGxldCBjaGF0SURGb3VuZCA9IG9jY3RDaGF0THRzQ29va2llLml4X2lkID8gb2NjdENoYXRMdHNDb29raWUuaXhfaWQgOiBcIlwiO1xuICAgIGlmIChjaGF0SURGb3VuZCAmJiBjaGF0UmVmSURGb3VuZCAmJiBhZ2VudElERm91bmQpIHtcbiAgICAgIHBvc3ROYXRpdmVDaGF0VXBkYXRlKEdFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCwge1xuICAgICAgICBjdXJyZW50V2ViUGFnZTogd2luZG93LmRvY3VtZW50LnRpdGxlLFxuICAgICAgICBDSEFUX0lEOiBjaGF0SURGb3VuZCxcbiAgICAgICAgYWdlbnRJRDogYWdlbnRJREZvdW5kLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMgJiYgIXNpdGVJbmZvRmlyZWQpIHtcbiAgICAgIFRlYWxpdW1QdWJTdWIucHVibGlzaChTSVRFX0lORk9fQVZBSUxBQkxFLCBjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpO1xuICAgICAgc2l0ZUluZm9GaXJlZCA9IHRydWU7XG4gICAgfVxuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCBcIlNpdGUgSW5mbyBBdmFpbGFibGVcIiwgY2hhdFNpdGVQYXJhbXMpO1xuICAgIGNvbnN0IGRhdGFUb1NlbmQgPSB7XG4gICAgICB1dGFnSW5pdDoge1xuICAgICAgICBwb3N0TWVzc2FnZU9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpbixcbiAgICAgICAgc2hvd0RlYnVnQ29uc29sZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBzZW5kUG9zdE1lc3NhZ2UoZGF0YVRvU2VuZCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gY2hhdFNpdGVIb3N0KSB7XG4gICAgICBsb2dHZW5lc3lzRXZlbnQoMiwgXCJJbmNvcnJlY3QgUG9zdCBNZXNzYWdlIE9yaWdpblwiLCBldmVudC5vcmlnaW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQuZGF0YSkge1xuICAgICAgY2FzZSBDQU5DRUxfV0lER0VUX1NVQlM6XG4gICAgICAgIHRlcm1pbmF0ZUdlbmVzeXNDaGF0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBHUkFCX0hFQVJUQkVBVF9EQVRBOlxuICAgICAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goR1JBQl9IRUFSVEJFQVRfREFUQSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDSEVDS19GT1JfU0FMRTpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICB3aGljaERvbWFpbigpID09PSBCT0ZBXG4gICAgICAgICAgPyBjaGVja0ZvclNhbGVJbmRpY2F0b3JzKFxuICAgICAgICAgICAgZGlnaXRhbERhdGEuY2FydCxcbiAgICAgICAgICAgIFwiZGlnaXRhbERhdGEuY2FydFwiLFxuICAgICAgICAgICAgQk9GQV9TQUxFX0lORElDQVRPUlNcbiAgICAgICAgICApXG4gICAgICAgICAgOiBjaGVja0ZvclNhbGVJbmRpY2F0b3JzKFxuICAgICAgICAgICAgZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQsXG4gICAgICAgICAgICBcImRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0XCIsXG4gICAgICAgICAgICBNTF9TQUxFX0lORElDQVRPUlNcbiAgICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0FOQ0VMX0hFQVJUQkVBVDpcbiAgICAgICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JTYWxlSW5kaWNhdG9ycyhcbiAgZGRvTG9jYXRpb246IG9iamVjdCxcbiAgZGRvTG9jYXRpb25TdHI6IHN0cmluZyxcbiAgc2FsZUluZGljYXRvcnM6IGFueVtdXG4pIHtcbiAgaWYgKFxuICAgIGJhY3RtICYmXG4gICAgYmFjdG0ucG9seWZpbGxzICYmXG4gICAgYmFjdG0ucG9seWZpbGxzLm9iamVjdC5leGlzdHMod2luZG93LCBkZG9Mb2NhdGlvblN0cilcbiAgKSB7XG4gICAgY29uc3Qgc2FsZVByZXNJbmQgPSBpc1NhbGVQcmVzZW50KGRkb0xvY2F0aW9uKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgc2FsZVByZXNJbmRcbiAgICAgID8gc2VuZFByb3h5UG9zdE1lc3NhZ2UoSU5RX0NMSUVOVF9PUkRFUl9OVU0sIHNhbGVQcmVzSW5kKVxuICAgICAgOiBzYWxlSW5kaWNhdG9ycy5mb3JFYWNoKChpbmRpY2F0b3IpID0+XG4gICAgICAgIHByb3h5Q2hhdERETyhkZG9Mb2NhdGlvbiwgaW5kaWNhdG9yKVxuICAgICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdFRvQ2FuY2VsU3Vic09uU2l0ZSgpIHtcbiAgdGVybWluYXRlR2VuZXN5c0NoYXQoKTtcbiAgc2VuZFBvc3RNZXNzYWdlKENBTkNFTF9TSVRFX1NVQlMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zdFRvQ2hlY2tBSFRva2VuKCkge1xuICBzZW5kUG9zdE1lc3NhZ2UoQ0hFQ0tfQUhfVE9LRU4pO1xufVxuXG4vLyBUaGlzIHNlbmRzIHRoZSBuYXRpdmVDaGF0IGRhdGEgdG8gdGhlIGNoYXRTaXRlXG5leHBvcnQgZnVuY3Rpb24gcG9zdE5hdGl2ZUNoYXRVcGRhdGUoZXZlbnRuYW1lOiBzdHJpbmcsIGRhdGFUb1NlbmQ6IG9iamVjdCkge1xuICBjb25zdCBuYXRpdmVDaGF0RGF0YSA9IHtcbiAgICBtZXNzYWdlOiBHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsXG4gICAgZGF0YVRvU2VuZCxcbiAgfTtcbiAgc2VuZFBvc3RNZXNzYWdlKHsgdnRpbURhdGE6IHsgLi4ubmF0aXZlQ2hhdERhdGEgfSB9KTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYWNzIG9ubHlcbmV4cG9ydCBmdW5jdGlvbiBwb3N0Q2hhdERldGFpbHMoXG4gIGV2ZW50bmFtZTogc3RyaW5nLFxuICBkYXRhVG9TZW5kOiBvYmplY3QgfCBzdHJpbmdcbikge1xuICBjb25zdCBjaGF0QWdlbnREZXRhaWxzID0ge1xuICAgIG1lc3NhZ2U6IEdFTkVTWVNfU0VUX0FHRU5UX0lELFxuICAgIGRhdGFUb1NlbmQsXG4gIH07XG4gIHNlbmRQb3N0TWVzc2FnZSh7IHZ0aW1EYXRhOiB7IC4uLmNoYXRBZ2VudERldGFpbHMgfSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE1vbml0b3JpbmdTdGF0dXMoc3RhdGUgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGJhY3RtLmRkby5zZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5tb25pdG9yaW5nXCIsIHN0YXRlKTtcbiAgICBjb25zdCBtb25pdG9yaW5nRGF0YSA9IHtcbiAgICAgIG1lc3NhZ2U6IFNFVF9NT05JVE9SSU5HX1NUQVRVUyxcbiAgICAgIG1vbml0b3JpbmdTdGF0dXM6IHN0YXRlLFxuICAgIH07XG4gICAgc2VuZFBvc3RNZXNzYWdlKHsgdnRpbURhdGE6IHsgLi4ubW9uaXRvcmluZ0RhdGEgfSB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ0dlbmVzeXNFdmVudCgzLCBcIlBNIHNldE1vbml0b3JpbmdTdGF0dXMgRXJyb3JcIiwgZSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQcm94eVBvc3RNZXNzYWdlKGtleTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gIGF3YWl0IHdpbmRvdy5ib2EuY2hhdC5yZWxvYWQoKTtcbiAgY29uc3QgbWVzc2FnZSA9IFNFTkRfUFJPWFlfREFUQTtcbiAgdHJ5IHtcbiAgICBzZW5kUG9zdE1lc3NhZ2Uoe1xuICAgICAgdnRpbURhdGE6IHsgbWVzc2FnZSwga2V5LCBuZXdWYWx1ZSwgZ2VuZXN5c0RhdGE6IHdpbmRvdy5nZW5lc3lzRGF0YSB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7IH1cbn1cblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZVBvc3RNZXNzYWdlLmJpbmQodGhpcyksIGZhbHNlKTtcbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMCwyMDExLDIwMTIsMjAxMywyMDE0IE1vcmdhbiBSb2RlcmljayBodHRwOi8vcm9kZXJpY2suZGtcbiAqIExpY2Vuc2U6IE1JVCAtIGh0dHA6Ly9tcmducmRyY2subWl0LWxpY2Vuc2Uub3JnXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL21yb2Rlcmljay9QdWJTdWJKU1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVE9ETyBpbiBmdXR1cmUgYWRkIGludGVyZmFjZXMgZm9yIFB1YlN1YiB0byBiZSBzaGFyZWQgd2l0aCBUZWFsaXVtUHViU3ViXG4gICAgY29uc3QgUHViU3ViOiBhbnkgPSB7fTtcblxuICAgIHZhciBtZXNzYWdlcyA9IHt9LFxuICAgICAgICBsYXN0VWlkID0gLTE7XG5cbiAgICBmdW5jdGlvbiBoYXNLZXlzKG9iajogeyBoYXNPd25Qcm9wZXJ0eTogKGFyZzA6IHN0cmluZykgPT4gYW55OyB9KXtcbiAgICAgICAgdmFyIGtleTtcblxuICAgICAgICBmb3IgKGtleSBpbiBvYmope1xuICAgICAgICAgICAgaWYgKCBvYmouaGFzT3duUHJvcGVydHkoa2V5KSApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0aHJvd3MgdGhlIHBhc3NlZCBleGNlcHRpb24sIGZvciB1c2UgYXMgYXJndW1lbnQgZm9yIHNldFRpbWVvdXRcbiAgICAgKiBAYWxpYXMgdGhyb3dFeGNlcHRpb25cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyBPYmplY3QgfSBleCBBbiBFcnJvciBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbiggZXg6IHVua25vd24gKXtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlVGhyb3dFeGNlcHRpb24oKXtcbiAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxTdWJzY3JpYmVyV2l0aERlbGF5ZWRFeGNlcHRpb25zKCBzdWJzY3JpYmVyOiAoYXJnMDogYW55LCBhcmcxOiBhbnkpID0+IHZvaWQsIG1lc3NhZ2U6IGFueSwgZGF0YTogYW55ICl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyKCBtZXNzYWdlLCBkYXRhICk7XG4gICAgICAgIH0gY2F0Y2goIGV4ICl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCB0aHJvd0V4Y2VwdGlvbiggZXggKSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxsU3Vic2NyaWJlcldpdGhJbW1lZGlhdGVFeGNlcHRpb25zKCBzdWJzY3JpYmVyOiAoYXJnMDogYW55LCBhcmcxOiBhbnkpID0+IHZvaWQsIG1lc3NhZ2U6IGFueSwgZGF0YTogYW55ICl7XG4gICAgICAgIHN1YnNjcmliZXIoIG1lc3NhZ2UsIGRhdGEgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWxpdmVyTWVzc2FnZSggb3JpZ2luYWxNZXNzYWdlOiBhbnksIG1hdGNoZWRNZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55LCBpbW1lZGlhdGVFeGNlcHRpb25zOiBhbnkgKXtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJzID0gbWVzc2FnZXNbbWF0Y2hlZE1lc3NhZ2VdLFxuICAgICAgICAgICAgY2FsbFN1YnNjcmliZXIgPSBpbW1lZGlhdGVFeGNlcHRpb25zID8gY2FsbFN1YnNjcmliZXJXaXRoSW1tZWRpYXRlRXhjZXB0aW9ucyA6IGNhbGxTdWJzY3JpYmVyV2l0aERlbGF5ZWRFeGNlcHRpb25zLFxuICAgICAgICAgICAgcztcblxuICAgICAgICBpZiAoICFtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eSggbWF0Y2hlZE1lc3NhZ2UgKSApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAocyBpbiBzdWJzY3JpYmVycyl7XG4gICAgICAgICAgICBpZiAoIHN1YnNjcmliZXJzLmhhc093blByb3BlcnR5KHMpKXtcbiAgICAgICAgICAgICAgICBjYWxsU3Vic2NyaWJlciggc3Vic2NyaWJlcnNbc10sIG9yaWdpbmFsTWVzc2FnZSwgZGF0YSApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlRGVsaXZlcnlGdW5jdGlvbiggbWVzc2FnZTogUHJvcGVydHlLZXksIGRhdGE6IGFueSwgaW1tZWRpYXRlRXhjZXB0aW9uczogYW55ICl7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBkZWxpdmVyTmFtZXNwYWNlZCgpe1xuICAgICAgICAgICAgdmFyIHRvcGljID0gU3RyaW5nKCBtZXNzYWdlICksXG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0b3BpYy5sYXN0SW5kZXhPZiggJy4nICk7XG5cbiAgICAgICAgICAgIC8vIGRlbGl2ZXIgdGhlIG1lc3NhZ2UgYXMgaXQgaXMgbm93XG4gICAgICAgICAgICBkZWxpdmVyTWVzc2FnZShtZXNzYWdlLCBtZXNzYWdlLCBkYXRhLCBpbW1lZGlhdGVFeGNlcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gdHJpbSB0aGUgaGllcmFyY2h5IGFuZCBkZWxpdmVyIG1lc3NhZ2UgdG8gZWFjaCBsZXZlbFxuICAgICAgICAgICAgd2hpbGUoIHBvc2l0aW9uICE9PSAtMSApe1xuICAgICAgICAgICAgICAgIHRvcGljID0gdG9waWMuc3Vic3RyKCAwLCBwb3NpdGlvbiApO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdG9waWMubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgICAgICBkZWxpdmVyTWVzc2FnZSggbWVzc2FnZSwgdG9waWMsIGRhdGEsIGltbWVkaWF0ZUV4Y2VwdGlvbnMgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXNzYWdlSGFzU3Vic2NyaWJlcnMoIG1lc3NhZ2U6IGFueSApe1xuICAgICAgICB2YXIgdG9waWMgPSBTdHJpbmcoIG1lc3NhZ2UgKSxcbiAgICAgICAgICAgIGZvdW5kID0gbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIHRvcGljICkgJiYgaGFzS2V5cyhtZXNzYWdlc1t0b3BpY10pLFxuICAgICAgICAgICAgcG9zaXRpb24gPSB0b3BpYy5sYXN0SW5kZXhPZiggJy4nICk7XG5cbiAgICAgICAgd2hpbGUgKCAhZm91bmQgJiYgcG9zaXRpb24gIT09IC0xICl7XG4gICAgICAgICAgICB0b3BpYyA9IHRvcGljLnN1YnN0ciggMCwgcG9zaXRpb24gKTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdG9waWMubGFzdEluZGV4T2YoICcuJyApO1xuICAgICAgICAgICAgZm91bmQgPSBtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eSggdG9waWMgKSAmJiBoYXNLZXlzKG1lc3NhZ2VzW3RvcGljXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHVibGlzaCggbWVzc2FnZTogUHJvcGVydHlLZXksIGRhdGE6IGFueSwgc3luYzogYm9vbGVhbiwgaW1tZWRpYXRlRXhjZXB0aW9uczogYW55ICl7XG4gICAgICAgIG1lc3NhZ2UgPSAodHlwZW9mIG1lc3NhZ2UgPT09ICdzeW1ib2wnKSA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2U7XG5cbiAgICAgICAgdmFyIGRlbGl2ZXIgPSBjcmVhdGVEZWxpdmVyeUZ1bmN0aW9uKCBtZXNzYWdlLCBkYXRhLCBpbW1lZGlhdGVFeGNlcHRpb25zICksXG4gICAgICAgICAgICBoYXNTdWJzY3JpYmVycyA9IG1lc3NhZ2VIYXNTdWJzY3JpYmVycyggbWVzc2FnZSApO1xuXG4gICAgICAgIGlmICggIWhhc1N1YnNjcmliZXJzICl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIHN5bmMgPT09IHRydWUgKXtcbiAgICAgICAgICAgIGRlbGl2ZXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoIGRlbGl2ZXIsIDAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaXNoZXMgdGhlIG1lc3NhZ2UsIHBhc3NpbmcgdGhlIGRhdGEgdG8gaXQncyBzdWJzY3JpYmVyc1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBhbGlhcyBwdWJsaXNoXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBwdWJsaXNoXG4gICAgICogQHBhcmFtIHt9IGRhdGEgVGhlIGRhdGEgdG8gcGFzcyB0byBzdWJzY3JpYmVyc1xuICAgICAqIEByZXR1cm4geyBCb29sZWFuIH1cbiAgICAgKi9cbiAgICBQdWJTdWIucHVibGlzaCA9IGZ1bmN0aW9uKCBtZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55ICl7XG4gICAgICAgIHJldHVybiBwdWJsaXNoKCBtZXNzYWdlLCBkYXRhLCBmYWxzZSwgUHViU3ViLmltbWVkaWF0ZUV4Y2VwdGlvbnMgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGlzaGVzIHRoZSB0aGUgbWVzc2FnZSBzeW5jaHJvbm91c2x5LCBwYXNzaW5nIHRoZSBkYXRhIHRvIGl0J3Mgc3Vic2NyaWJlcnNcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAYWxpYXMgcHVibGlzaFN5bmNcbiAgICAgKiBAcGFyYW0geyBTdHJpbmcgfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHB1Ymxpc2hcbiAgICAgKiBAcGFyYW0ge30gZGF0YSBUaGUgZGF0YSB0byBwYXNzIHRvIHN1YnNjcmliZXJzXG4gICAgICogQHJldHVybiB7IEJvb2xlYW4gfVxuICAgICAqL1xuICAgIFB1YlN1Yi5wdWJsaXNoU3luYyA9IGZ1bmN0aW9uKCBtZXNzYWdlOiBQcm9wZXJ0eUtleSwgZGF0YTogYW55ICl7XG4gICAgICAgIHJldHVybiBwdWJsaXNoKCBtZXNzYWdlLCBkYXRhLCB0cnVlLCBQdWJTdWIuaW1tZWRpYXRlRXhjZXB0aW9ucyApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmVzIHRoZSBwYXNzZWQgZnVuY3Rpb24gdG8gdGhlIHBhc3NlZCBtZXNzYWdlLiBFdmVyeSByZXR1cm5lZCB0b2tlbiBpcyB1bmlxdWUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaWYgeW91IG5lZWQgdG8gdW5zdWJzY3JpYmVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAYWxpYXMgc3Vic2NyaWJlXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdWJzY3JpYmUgdG9cbiAgICAgKiBAcGFyYW0geyBGdW5jdGlvbiB9IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHB1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIFB1YlN1Yi5zdWJzY3JpYmUgPSBmdW5jdGlvbiggbWVzc2FnZTogUHJvcGVydHlLZXksIGZ1bmM6IGFueSApe1xuICAgICAgICBpZiAoIHR5cGVvZiBmdW5jICE9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UgPSAodHlwZW9mIG1lc3NhZ2UgPT09ICdzeW1ib2wnKSA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2U7XG5cbiAgICAgICAgLy8gbWVzc2FnZSBpcyBub3QgcmVnaXN0ZXJlZCB5ZXRcbiAgICAgICAgaWYgKCAhbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIG1lc3NhZ2UgKSApe1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZvcmNpbmcgdG9rZW4gYXMgU3RyaW5nLCB0byBhbGxvdyBmb3IgZnV0dXJlIGV4cGFuc2lvbnMgd2l0aG91dCBicmVha2luZyB1c2FnZVxuICAgICAgICAvLyBhbmQgYWxsb3cgZm9yIGVhc3kgdXNlIGFzIGtleSBuYW1lcyBmb3IgdGhlICdtZXNzYWdlcycgb2JqZWN0XG4gICAgICAgIHZhciB0b2tlbiA9ICd1aWRfJyArIFN0cmluZygrK2xhc3RVaWQpO1xuICAgICAgICBtZXNzYWdlc1ttZXNzYWdlXVt0b2tlbl0gPSBmdW5jO1xuXG4gICAgICAgIC8vIHJldHVybiB0b2tlbiBmb3IgdW5zdWJzY3JpYmluZ1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgdGhlIHBhc3NlZCBmdW5jdGlvbiB0byB0aGUgcGFzc2VkIG1lc3NhZ2Ugb25jZVxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBhbGlhcyBzdWJzY3JpYmVPbmNlXG4gICAgICogQHBhcmFtIHsgU3RyaW5nIH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzdWJzY3JpYmUgdG9cbiAgICAgKiBAcGFyYW0geyBGdW5jdGlvbiB9IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG5ldyBtZXNzYWdlIGlzIHB1Ymxpc2hlZFxuICAgICAqIEByZXR1cm4geyBQdWJTdWIgfVxuICAgICAqL1xuICAgIFB1YlN1Yi5zdWJzY3JpYmVPbmNlID0gZnVuY3Rpb24oIG1lc3NhZ2U6IGFueSwgZnVuYzogYW55ICk6IHR5cGVvZiBQdWJTdWIge1xuICAgICAgICB2YXIgdG9rZW4gPSBQdWJTdWIuc3Vic2NyaWJlKCBtZXNzYWdlLCBmdW5jdGlvbiAodGhpczogYW55KXtcbiAgICAgICAgICAgIC8vIGJlZm9yZSBmdW5jIGFwcGx5LCB1bnN1YnNjcmliZSBtZXNzYWdlXG4gICAgICAgICAgICBQdWJTdWIudW5zdWJzY3JpYmUoIHRva2VuICk7XG4gICAgICAgICAgICBmdW5jLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQdWJTdWI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgc3Vic2NyaXB0aW9uc1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAYWxpYXMgY2xlYXJBbGxTdWJzY3JpcHRpb25zXG4gICAgICovXG4gICAgUHViU3ViLmNsZWFyQWxsU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIGNsZWFyQWxsU3Vic2NyaXB0aW9ucygpe1xuICAgICAgICBtZXNzYWdlcyA9IHt9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBzdWJzY3JpcHRpb25zIGJ5IHRoZSB0b3BpY1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwdWJsaWNcbiAgICAgKiBAYWxpYXMgY2xlYXJBbGxTdWJzY3JpcHRpb25zXG4gICAgICovXG4gICAgUHViU3ViLmNsZWFyU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIGNsZWFyU3Vic2NyaXB0aW9ucyh0b3BpYzogc3RyaW5nKXtcbiAgICAgICAgdmFyIG07XG4gICAgICAgIGZvciAobSBpbiBtZXNzYWdlcyl7XG4gICAgICAgICAgICBpZiAobWVzc2FnZXMuaGFzT3duUHJvcGVydHkobSkgJiYgbS5pbmRleE9mKHRvcGljKSA9PT0gMCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW21dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgc3Vic2NyaXB0aW9uc1xuICAgICAqXG4gICAgICogLSBXaGVuIHBhc3NlZCBhIHRva2VuLCByZW1vdmVzIGEgc3BlY2lmaWMgc3Vic2NyaXB0aW9uLlxuICAgICAqXG4gICAgICogLSBXaGVuIHBhc3NlZCBhIGZ1bmN0aW9uLCByZW1vdmVzIGFsbCBzdWJzY3JpcHRpb25zIGZvciB0aGF0IGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiAtIFdoZW4gcGFzc2VkIGEgdG9waWMsIHJlbW92ZXMgYWxsIHN1YnNjcmlwdGlvbnMgZm9yIHRoYXQgdG9waWMgKGhpZXJhcmNoeSlcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcHVibGljXG4gICAgICogQGFsaWFzIHN1YnNjcmliZU9uY2VcbiAgICAgKiBAcGFyYW0geyBTdHJpbmcgfCBGdW5jdGlvbiB9IHZhbHVlIEEgdG9rZW4sIGZ1bmN0aW9uIG9yIHRvcGljIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAgICAgKiBAZXhhbXBsZSAvLyBVbnN1YnNjcmliaW5nIHdpdGggYSB0b2tlblxuICAgICAqIHZhciB0b2tlbiA9IFB1YlN1Yi5zdWJzY3JpYmUoJ215dG9waWMnLCBteUZ1bmMpO1xuICAgICAqIFB1YlN1Yi51bnN1YnNjcmliZSh0b2tlbik7XG4gICAgICogQGV4YW1wbGUgLy8gVW5zdWJzY3JpYmluZyB3aXRoIGEgZnVuY3Rpb25cbiAgICAgKiBQdWJTdWIudW5zdWJzY3JpYmUobXlGdW5jKTtcbiAgICAgKiBAZXhhbXBsZSAvLyBVbnN1YnNjcmliaW5nIGZyb20gYSB0b3BpY1xuICAgICAqIFB1YlN1Yi51bnN1YnNjcmliZSgnbXl0b3BpYycpO1xuICAgICAqL1xuICAgIFB1YlN1Yi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpe1xuICAgICAgICB2YXIgZGVzY2VuZGFudFRvcGljRXhpc3RzID0gZnVuY3Rpb24odG9waWM6IHN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhciBtO1xuICAgICAgICAgICAgICAgIGZvciAoIG0gaW4gbWVzc2FnZXMgKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBtZXNzYWdlcy5oYXNPd25Qcm9wZXJ0eShtKSAmJiBtLmluZGV4T2YodG9waWMpID09PSAwICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRlc2NlbmRhbnQgb2YgdGhlIHRvcGljIGV4aXN0czpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzVG9waWMgICAgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICggbWVzc2FnZXMuaGFzT3duUHJvcGVydHkodmFsdWUpIHx8IGRlc2NlbmRhbnRUb3BpY0V4aXN0cyh2YWx1ZSkgKSxcbiAgICAgICAgICAgIGlzVG9rZW4gICAgPSAhaXNUb3BpYyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICAgICAgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlLFxuICAgICAgICAgICAgbSwgbWVzc2FnZSwgdDtcblxuICAgICAgICBpZiAoaXNUb3BpYyl7XG4gICAgICAgICAgICBQdWJTdWIuY2xlYXJTdWJzY3JpcHRpb25zKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoIG0gaW4gbWVzc2FnZXMgKXtcbiAgICAgICAgICAgIGlmICggbWVzc2FnZXMuaGFzT3duUHJvcGVydHkoIG0gKSApe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1ttXTtcblxuICAgICAgICAgICAgICAgIGlmICggaXNUb2tlbiAmJiBtZXNzYWdlW3ZhbHVlXSApe1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZVt2YWx1ZV07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbnMgYXJlIHVuaXF1ZSwgc28gd2UgY2FuIGp1c3Qgc3RvcCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoIHQgaW4gbWVzc2FnZSApe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkodCkgJiYgbWVzc2FnZVt0XSA9PT0gdmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlW3RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB3aW5kb3cuVGVhbGl1bVB1YlN1YiA9IFB1YlN1Yjtcbn0iLCJcbi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHB1YnN1Yi9zdWJzY3JpcHRpb25zICovXG5cbmltcG9ydCB7XG4gIEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJBVElPTixcbiAgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSxcbiAgTU9OSVRPUklOR0pTX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HX0lEX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HSlNfUkVRVUVTVCxcbiAgTU9OSVRPUklOR19DTEVBUl9IRUFSVEJFQVQsXG4gIFBNX1NFTkRfU0FMRV9PQ0NVUlJFRCxcbiAgR0VORVNZU19RVUFMSUZJRURfTEVBRCxcbiAgR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcsXG4gIEdFTkVTWVNfUkVRVUVTVF9GRVRDSF9TRVNTSU9OLFxuICBTSVRFX0lORk9fQVZBSUxBQkxFLFxuICBHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLFxuICBURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIsXG4gIEdFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCxcbiAgR0VORVNZU19TRVRfQUdFTlRfSUQsXG59IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IHB1Ymxpc2hXaW5kb3csIHB1Ymxpc2hUZWFsaXVtIH0gZnJvbSBcIi4uL3V0aWxpdGllcy91dGlsaXRpZXNcIjtcblxuaW1wb3J0IGNvbmZpZ3VyZUNvYnJvd3NlIGZyb20gXCIuLi93aWRnZXQtYXBpL2NvbmZpZ3VyZS1jb2Jyb3dzZVwiO1xuaW1wb3J0IGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSBmcm9tIFwiLi4vc2FsZXMvcmVzcG9uc2VcIjtcbmltcG9ydCB7IHBvc3RDaGF0RGV0YWlscyB9IGZyb20gXCIuL3Bvc3QtbWVzc2FnZXNcIjtcblxuLyoqXG4gKiBTdWJzY3JpYmUgVGVhbGl1bSBhbmQgU3BhcnRhIHdpZGdldCBsb2FkZXIgZXZlbnRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge1xuICBjb25zdCB7IHdpZGdldExvYWRlcjogU3BhcnRhUHViU3ViIH0gPSB3aW5kb3cuc3BhcnRhLmNoYXQ7XG4gIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKE1PTklUT1JJTkdfSURfUkVTUE9OU0UsIHB1Ymxpc2hXaW5kb3cpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShQTV9TRU5EX1NBTEVfT0NDVVJSRUQsIHB1Ymxpc2hXaW5kb3cpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShNT05JVE9SSU5HSlNfUkVTUE9OU0UsIGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSk7XG5cbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoU0lURV9JTkZPX0FWQUlMQUJMRSwgcHVibGlzaFdpbmRvdyk7XG4gIFNwYXJ0YVB1YlN1Yi5zdWIoR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkFUSU9OLCBjb25maWd1cmVDb2Jyb3dzZSk7XG5cbiAgU3BhcnRhUHViU3ViLnN1YihcbiAgICBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTixcbiAgICAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IG9iamVjdCB9KSA9PiB7XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTiwgZGV0YWlsKTtcbiAgICB9XG4gICk7XG4gIFNwYXJ0YVB1YlN1Yi5zdWIoXG4gICAgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURSxcbiAgICAoeyBkZXRhaWwgfTogeyBkZXRhaWw6IG9iamVjdCB9KSA9PiB7XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFLCBkZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgU3BhcnRhUHViU3ViLnN1YihcbiAgICBHRU5FU1lTX1JFUVVFU1RfTkFUSVZFX0NIQVQsXG4gICAgKHsgZGV0YWlsIH06IHsgZGV0YWlsOiBvYmplY3QgfSkgPT4ge1xuICAgICAgcHVibGlzaFRlYWxpdW0oR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCBkZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgU3BhcnRhUHViU3ViLnN1YihNT05JVE9SSU5HX0NMRUFSX0hFQVJUQkVBVCwgKCkgPT5cbiAgICBwdWJsaXNoVGVhbGl1bShNT05JVE9SSU5HX0NMRUFSX0hFQVJUQkVBVClcbiAgKTtcblxuICBTcGFydGFQdWJTdWIuc3ViKFxuICAgIEdFTkVTWVNfU0VUX0FHRU5UX0lELFxuICAgIChlOiB7IHR5cGU6IHN0cmluZzsgZGV0YWlsOiBvYmplY3QgfCBzdHJpbmcgfSkgPT4ge1xuICAgICAgcG9zdENoYXREZXRhaWxzKGUudHlwZSwgZS5kZXRhaWwpO1xuICAgIH1cbiAgKTtcbiAgaWYgKHdpbmRvdy5kaWdpdGFsRGF0YSAmJiAhd2luZG93LmRpZ2l0YWxEYXRhLm9uX2ludGVybmFsX3BhZ2UpIHtcbiAgICBTcGFydGFQdWJTdWIuc3ViKEdFTkVTWVNfUVVBTElGSUVEX0xFQUQsICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICBwdWJsaXNoVGVhbGl1bShHRU5FU1lTX1FVQUxJRklFRF9MRUFELCBkZXRhaWwpXG4gICAgKTtcblxuICAgIFNwYXJ0YVB1YlN1Yi5zdWIoTU9OSVRPUklOR0pTX1JFUVVFU1QsICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICBwdWJsaXNoVGVhbGl1bShNT05JVE9SSU5HSlNfUkVRVUVTVCwgZGV0YWlsKVxuICAgICk7XG5cbiAgICBTcGFydGFQdWJTdWIuc3ViKFxuICAgICAgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSxcbiAgICAgICh7IGRldGFpbCB9OiB7IGRldGFpbDogb2JqZWN0IH0pID0+XG4gICAgICAgIHB1Ymxpc2hUZWFsaXVtKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREUsIGRldGFpbClcbiAgICApO1xuXG4gICAgU3BhcnRhUHViU3ViLnN1YihHRU5FU1lTX1NVU1BFTkRfTU9OSVRPUklORywgKCkgPT5cbiAgICAgIHB1Ymxpc2hUZWFsaXVtKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKVxuICAgICk7XG4gIH1cbiAgU3BhcnRhUHViU3ViLnB1YihURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIsIHt9KTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcbi8qKiBAbW9kdWxlIHB1YnN1Yi93aWRnZXQtc2NyaXB0LWxvYWRlZCAqL1xuXG5pbXBvcnQge1xuICBlcnJvckxvYWRpbmdXaWRnZXQsXG4gIFNQQVJUQV9XSURHRVRfUkVBRFksXG4gIENIQVRfSU5JVElBTElaQVRJT04sXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT04sXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fRVJST1IsXG4gIFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5cbmltcG9ydCBkb2N1bWVudEV2ZW50cyBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHtcbiAgaXNWNixcbiAgZ2V0VjZXaWRnZXRDb25maWcsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbn0gZnJvbSAnLi4vdXRpbGl0aWVzL3V0aWxpdGllcyc7XG5cbi8qKlxuICogT25jZSB3aWRnZXQgY29uZmlndXJhdGlvbiBsb2FkLCBmaXJlcyBvbiBzdWNjZXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hXaWRnZXRDb25maWd1cmF0aW9uU3VjY2VzcygpIHtcbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCwge30pO1xuICBsb2dHZW5lc3lzRXZlbnQoMSwgJ1dpZGdldCBDb25maWd1cmF0aW9uIFJlc3BvbnNlJywgYHB1Ymxpc2hpbmcgJHtXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX1NVQ0NFU1NGVUx9YCk7XG59XG5cbi8qKlxuICogT25jZSB3aWRnZXQgY29uZmlndXJhdGlvbiBsb2FkLCBmaXJlcyBvbiBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoV2lkZ2V0Q29uZmlndXJhdGlvbkVycm9yKCkge1xuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUiwge30pO1xuICBsb2dHZW5lc3lzRXZlbnQoMywgJ1dpZGdldCBDb25maWd1cmF0aW9uIFJlc3BvbnNlJywgYHB1Ymxpc2hpbmcgJHtXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OX0VSUk9SfWApO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgd2lkZ2V0IGNvbmZpZ3VyYXRpb24gZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gd2lkZ2V0Q29uZmlndXJhdGlvbiAtIFdpZGdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVXaWRnZXRDb25maWd1cmF0aW9uKGV2ZW50TmFtZTogc3RyaW5nLCB3aWRnZXRDb25maWd1cmF0aW9uOiBvYmplY3QpOiBib29sZWFuIHtcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIGlmICghdjYpIHtcbiAgICBsb2FkTGVnYWN5Q2hhdCh7IHdpZGdldENvbmZpZ3VyYXRpb24gfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgd2lkZ2V0Q29uZmlndXJhdGlvbiA9IGdldFY2V2lkZ2V0Q29uZmlnKCk7XG4gICAgbG9hZFY2Q2hhdCh7IHdpZGdldENvbmZpZ3VyYXRpb24gfSk7XG4gIH1cbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdXaWRnZXQgQ29uZmlndXJhdGlvbicsIHdpZGdldENvbmZpZ3VyYXRpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cblxuXG5leHBvcnQgY29uc3QgbG9hZFY2Q2hhdCA9ICh7IHdpZGdldENvbmZpZ3VyYXRpb24gfTogeyB3aWRnZXRDb25maWd1cmF0aW9uOiBhbnkgfSkgPT4ge1xuICBjb25zdCBsb2FkZXJWZXJzaW9uID0gd2lkZ2V0Q29uZmlndXJhdGlvbi5sb2FkZXJWZXJzaW9uO1xuICBjb25zdCB2NkNvbmZpZyA9IGdldFY2V2lkZ2V0Q29uZmlnKCk7XG4gIHY2Q29uZmlnLm9wdGlvbnMub25FcnJvciA9ICgpID0+IHtcbiAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUiwge30pO1xuICAgIGNvbnNvbGUubG9nKFwib25FcnJvclwiKTtcbiAgfTtcbiAgdjZDb25maWcub3B0aW9ucy5vbkxvYWQgPSAoKSA9PiB7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCwge30pO1xuICAgIGNvbnNvbGUubG9nKFwib25Mb2FkXCIpO1xuICB9O1xuICB3aW5kb3cuc3BhcnRhLndpZGdldExvYWRlcltsb2FkZXJWZXJzaW9uXS5sb2FkKHY2Q29uZmlnKTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGxvYWRMZWdhY3lDaGF0ID0gKHsgd2lkZ2V0Q29uZmlndXJhdGlvbiB9OiB7IHdpZGdldENvbmZpZ3VyYXRpb246IG9iamVjdCB9KSA9PiB7XG4gIHdpbmRvdy5zcGFydGEuY2hhdC53aWRnZXRMb2FkZXIubG9hZCh3aWRnZXRDb25maWd1cmF0aW9uKTtcbiAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5zdWIoXG4gICAgZXJyb3JMb2FkaW5nV2lkZ2V0LFxuICAgIHB1Ymxpc2hXaWRnZXRDb25maWd1cmF0aW9uRXJyb3JcbiAgKTtcbiAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5zdWIoXG4gICAgU1BBUlRBX1dJREdFVF9SRUFEWSxcbiAgICBwdWJsaXNoV2lkZ2V0Q29uZmlndXJhdGlvblN1Y2Nlc3NcbiAgKTtcbn07XG5cbi8qKlxuICogUHVibGlzaCBjaGF0IGluaXRpYWxpemF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hDaGF0SW5pdGlhbGl6YXRpb24oKTogYm9vbGVhbiB7XG4gIFRlYWxpdW1QdWJTdWIucHVibGlzaChDSEFUX0lOSVRJQUxJWkFUSU9OLCB7fSk7XG4gIGxvZ0dlbmVzeXNFdmVudCgxLCAnQ2hhdCBJbml0aWFsaXphdGlvbicsIGBwdWJsaXNoaW5nICR7Q0hBVF9JTklUSUFMSVpBVElPTn1gKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERvY3VtZW50IHNldCBldmVudCwgc3BhcnRhIGV2ZW50IGZpcmVkLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFydGFMb2FkZXJMb2FkZWRFdmVudCgpOiBib29sZWFuIHtcbiAgZG9jdW1lbnRFdmVudHMoKTtcbiAgcHVibGlzaENoYXRJbml0aWFsaXphdGlvbigpO1xuICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShXSURHRVRfUkVRVUVTVF9DT05GSUdVUkFUSU9OLCBzdWJzY3JpYmVXaWRnZXRDb25maWd1cmF0aW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIE9uY2Ugd2lkZ2V0IHNjcmlwdCBoYXMgbG9hZGVkIFwic3BhcnRhTG9hZGVyTG9hZGVkIGV2ZW50IHdpbGxcbiAqIGZpcmVcIiBFdmVudCB3aWxsIGZpcmUgY2FsbGJhY2sgXCJzcGFydGFMb2FkZXJMb2FkZWRFdmVudFwiXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICBpZiAod2luZG93LnNwYXJ0YSAmJiB3aW5kb3cuc3BhcnRhLmNoYXQgJiYgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlcikge1xuICAgIHNwYXJ0YUxvYWRlckxvYWRlZEV2ZW50KCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhdC5zcGFydGFMb2FkZXJMb2FkZWQnLCBzcGFydGFMb2FkZXJMb2FkZWRFdmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLyoqIEBtb2R1bGUgcHVic3ViL3dpZGdldC1zY3JpcHQgKi9cbmltcG9ydCB7XG4gIGdldERvbWFpbixcbiAgaXNWNixcbiAgbG9nR2VuZXN5c0V2ZW50LFxufSBmcm9tICcuLi91dGlsaXRpZXMvdXRpbGl0aWVzJztcblxuXG5cbi8qKlxuICogQ3JlYXRlIGEgc2NyaXB0IHRhZywgd2lkZ2V0IGxvYWRlciB2ZXJzaW9uIGNhbiBjaGFuZ2UuIFNldCB0eXBlIGFuZCBzcmNcbiAqIGF0dHJpYnV0ZS4gSWYgbG9jYWxob3N0IHwgc2V0IHRvIGxvY2FsaG9zdDozMDA1ICh3aWRnZXQncyBkZWZhdWx0IGxvY2FsaG9zdCkuXG4gKiBBcHBlbmQgbG9hZGVyIHRvIGJvZHkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb21haW4gPSBnZXREb21haW4oKTtcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIC8vIFBvbHlmaWxscyBzY3JpcHRcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdQb2x5ZmlsbFNjcmlwdCcsICdjcmVhdGluZyBCYWJlbCBQb2x5ZmlsbHMgU2NyaXB0Jyk7XG5cbiAgaWYgKCF2Nikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2dGltUG9seWZpbGxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICB2dGltUG9seWZpbGxzLmlkID0gJ3Z0aW0tcG9seWZpbGwtc2NyaXB0JztcbiAgICAgIGNvbnN0IHZ0aW1Qb2x5ZmlsbHNFbmRwb2ludCA9ICcvc3BhL3dpZGdldHMvd3d3LWNoYXQvMy4wLjAvc3BhLWFzc2V0cy9jb21wb25lbnRzL3V0aWxpdGllcy9wbGF0Zm9ybS9iYWJlbC1wb2x5ZmlsbC5qcz9fPScgKyBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdnRpbVBvbHlmaWxsc1VSTCA9IGRvbWFpbiArIHZ0aW1Qb2x5ZmlsbHNFbmRwb2ludDtcbiAgICAgIHZ0aW1Qb2x5ZmlsbHMuc3JjID0gdnRpbVBvbHlmaWxsc1VSTDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodnRpbVBvbHlmaWxscyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdXaWRnZXRTY3JpcHQnLCAnY3JlYXRpbmcgV2lkZ2V0IFNjcmlwdCcpO1xuICBjb25zdCBsb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgbG9hZGVyLmlkID0gJ2xvYWRlci1zY3JpcHQnO1xuICBsb2FkZXIuZGF0YXNldC53aWRnZXROYW1lID0gJ2NoYXQnO1xuICBjb25zdCB3aWRnZXRTY3JpcHRVUkkgPSAnL3NwYS93aWRnZXRzL2xvYWRlci8zLjAuMS9pbmRleC5qcyc7XG4gIGxvYWRlci50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gIGxvYWRlci5zcmMgPSBgJHtkb21haW59JHt3aWRnZXRTY3JpcHRVUkl9YDtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsb2FkZXIpO1xuICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiogQG1vZHVsZSB3aWRnZXQtbG9hZGVyL3NhbGVzL2ZldGNoLXNlc3Npb24gKi9cblxuaW1wb3J0IGZldGNoV2l0aFJldHJ5IGZyb20gXCIuLi91dGlsaXRpZXMvZmV0Y2gtd2l0aC1yZXRyeVwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudERvbWFpbiwgaW5jcmVhc2VFcnJvckNvdW50LCBsb2dHZW5lc3lzRXZlbnQsIHB1Ymxpc2hXaW5kb3cgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IHsgY2hhdFNpdGVQYXJhbXMsIEdFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVCwgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fRkFJTFVSRSwgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fU1VDQ0VTUywgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCBQSVhFTF9UQUdfVVJMLCBTSVRFX0lORk9fQVZBSUxBQkxFIH0gZnJvbSBcIi4uL3dpZGdldC1jb25zdGFudHNcIjtcbmltcG9ydCBnZXRDb29raWVTdG9yYWdlIGZyb20gXCIuLi91dGlsaXRpZXMvZ2V0LWNvb2tpZVwiO1xuaW1wb3J0IG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UgZnJvbSBcIi4uL3V0aWxpdGllcy9sb2dnZXJcIjtcbi8qKlxuICogRXJyb3IgZmV0Y2hSZWZTZXNzaW9uIEV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgLSBFcnJvciByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckZldGNoU2Vzc2lvbkV2ZW50KHJlc3BvbnNlOiBvYmplY3QpIHtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9GQUlMVVJFLCByZXNwb25zZSk7XG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIHtcbiAgICBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke3Jlc3BvbnNlfWApO1xuICB9XG4gIGxvZ0dlbmVzeXNFdmVudCgzLCAnR2VuZXN5cyBSZXF1ZXN0IEZldGNoIFNlc3Npb24gRmFpbHVyZScsIHJlc3BvbnNlKTtcbiAgbW9iaWxlQUNTTG9nZ2VyU2VydmljZSgnZ2V0UmVmSWRJbmZvJywgcmVzcG9uc2UpO1xuICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBTdWNjZXNzIGZldGNoUmVmU2Vzc2lvbiBFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gU3VjY2VzcyByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKlxuICogc3VjY2VzcyByZXNwb25zZVxuICoge1xuICogICBhZ2VudElEOiBcIjZIOThGTUdCN1Q3RVA5RTNWRjZRVkVERzNTMDAwMERGXCIsXG4gKiAgIGNoYXRJRDogXCJBMUQzU0ZBM0pFNTQxMjM0QTNENTY3RjhBOTEwXCJcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzRmV0Y2hTZXNzaW9uRXZlbnQocmVzcG9uc2U6IHsgQUdFTlRfSUQ/OiBzdHJpbmcsIENIQVRfSUQ/OiBzdHJpbmcgfSkge1xuICAvLyBzZXRzIGZsYWcgdG8gdHJ1ZVxuICBjb25zdCBjdXJyZW50V2ViUGFnZSA9IHdpbmRvdy5kb2N1bWVudC50aXRsZVxuICBjb25zdCBhZ2VudExUUyA9IGJhY3RtLlN0b3JlKCdjaGF0JywgeyB0eXBlOiAnY29va2llJyB9KTtcbiAgLy8gdGhpcyBzZXRzIGJhY3RtX2x0cyBjb29raWUgY2VydGFpbiBzYWxlcyBmbG93IGNoZWNrIHRoZSBiYWN0bV9sdHMgY29va2llIHJhdGhlciB0aGFuIHRoZSBvY2N0Q2hhdF9sdHMgY29va2llXG4gIGFnZW50TFRTLnNldCgnc2VjdXJlQWdlbnRJRCcsIHJlc3BvbnNlPy5BR0VOVF9JRCk7XG4gIGFnZW50TFRTLnNhdmUoKTtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9TVUNDRVNTLCByZXNwb25zZSk7XG4gIHB1Ymxpc2hXaW5kb3coR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFULCB7IGN1cnJlbnRXZWJQYWdlLCAuLi5yZXNwb25zZSB9KVxuICBsb2dHZW5lc3lzRXZlbnQoMSwgJ0dlbmVzeXMgUmVxdWVzdCBGZXRjaCBTZXNzaW9uIFN1Y2Nlc3MnLCByZXNwb25zZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNYWtlcyBmZXRjaFNlc3Npb24gcmVxdWVzdFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZJRCAtIHJlZmVyZW5jZSBJRCAtIERldmljZSBJRCAoR1VJRClcbiAqIEBwYXJhbSB7c3RyaW5nfSB0cmFjZUlEIC0gdHJhY2UgSUQgLSBhbGxvd3MgZm9yIGRlYnVnZ2luZyBhbmQgc2Vzc2lvbiB0cmFja2luZyBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGV2ZW50OiBzdHJpbmcsIHJlZklEOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGJhY3RtID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXRjaCBSZXF1ZXN0OiBCYWN0bSBub3QgZGVmaW5lZCcpXG4gICAgfTtcblxuICAgIGNvbnN0IGJhY3RtTHRzQ29va2llID0gZ2V0Q29va2llU3RvcmFnZSgnYmFjdG1fbHRzJyk7XG4gICAgY29uc3Qgc2FsZXNSbGQgPSBiYWN0bUx0c0Nvb2tpZT8uY2hhdFNlcnZpY2U/LlJMRD8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc2FsZXMnKTtcbiAgICBjb25zdCBzZWN1cmVBZ2VudElEID0gYmFjdG1MdHNDb29raWU/LmNoYXQ/LnNlY3VyZUFnZW50SUQ7XG5cbiAgICAvLyBjaGVja2luZyBpZiB3ZSBoYXZlIGFuIGFnZW50SWQgYW5kIGlmIHJsZCBpcyBzYWxlcywgaWYgd2UgaGF2ZSBib3RoIGRvbid0IGZpcmUgcmVmSWQgY2FsbFxuICAgIGlmIChzYWxlc1JsZCAmJiBzZWN1cmVBZ2VudElEKSB7XG4gICAgICBjb25zb2xlLmxvZygnVGhlIEdldFJlZklESW5mbyBlbmRwb2ludCB3aWxsIG5vdCBiZSBjYWxsZWQgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYW4gYWdlbnRJRCcpXG4gICAgICAvLyByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICBjb25zdCBmZXRjaFJlZklEUGFyYW1zID0ge1xuICAgICAgX0NIQVRfUkVGX0lEOiByZWZJRCxcbiAgICAgIF9UUkFDRV9JRDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICB9XG4gICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGZXRjaCBTZXNzaW9uIFJlcXVlc3QgcGFyYW1zJywgZmV0Y2hSZWZJRFBhcmFtcyk7XG4gICAgXG4gICAgY29uc3QgZmlyZVJlZklEQ2hlY2sgPSAoZXZlbnQ6IHN0cmluZywgY2hhdFNpdGVEb21haW5zOiBvYmplY3QpID0+IHtcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnRmlyaW5nIHJlZklEIGZldGNoJywgY2hhdFNpdGVEb21haW5zKVxuICAgICAgY29uc3QgZ2VuZXN5c0ZldGNoU2Vzc2lvbkVuZHBvaW50VVJMID1gJHtjaGF0U2l0ZURvbWFpbnNbY3VycmVudFRMRF0uZ2VuZXN5c30ke0dFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVH1gO1xuICAgICAgZmV0Y2hXaXRoUmV0cnkoZ2VuZXN5c0ZldGNoU2Vzc2lvbkVuZHBvaW50VVJMLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShmZXRjaFJlZklEUGFyYW1zKSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJ1xuICAgICAgfSkudGhlbihzdWNjZXNzRmV0Y2hTZXNzaW9uRXZlbnQpLmNhdGNoKGVycm9yRmV0Y2hTZXNzaW9uRXZlbnQpO1xuICAgIH1cbiAgICAgIC8vIGlmIGNoYXRTaXRlIHBhcmFtcyBoYXZlIG5vdCBiZWVuIHJlY2VpdmVkXG4gICAgaWYgKCFjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpIHtcbiAgICAgIC8vIHdhaXQgZm9yIFNJVEVfSU5GT19BVkFJTEFCTEUgZXZlbnQsIHRoZW4gZmlyZSBmZXRjaCByZXF1ZXN0XG4gICAgICBUZWFsaXVtUHViU3ViLnN1YnNjcmliZShTSVRFX0lORk9fQVZBSUxBQkxFLCBmaXJlUmVmSURDaGVjaylcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnU3Vic2NyaWJpbmcgdG8gU0lURV9JTkZPX0FWQUlMQUJMRScsIHt9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXJlIGZldGNoIHJlcXVlc3RcbiAgICAgIGZpcmVSZWZJRENoZWNrKFNJVEVfSU5GT19BVkFJTEFCTEUsIGNoYXRTaXRlUGFyYW1zLnNwYVBhcmFtcylcbiAgICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnRmV0Y2hpbmcgUmVmSUQnLCB7fSlcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0ZldGNoIFNlc3Npb24gRXJyb3InLCBlKTtcbiAgICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgfVxufSIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHNhbGVzL2dlbmVzeXMtZGF0YS5qcyAqL1xuaW1wb3J0IHsgd2hpY2hEb21haW4sIGlzRW1wdHlBcnIsIGlzRW1wdHlPYmogfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IHsgTUVSUklMTCwgSU5URVJOQUwgfSBmcm9tIFwiLi4vd2lkZ2V0LWNvbnN0YW50c1wiO1xuXG5mdW5jdGlvbiBfcHJlcGFyZURhdGEoZGRvOiBhbnkpIHtcbiAgY29uc3QgZGRvQ2hhdERhdGEgPVxuICAgIGJhY3RtICYmXG4gICAgYmFjdG0ucG9seWZpbGxzICYmXG4gICAgYmFjdG0ucG9seWZpbGxzLm9iamVjdC5leGlzdHMoZGlnaXRhbERhdGEsIFwicGFnZS5hdHRyaWJ1dGVzLmNoYXRcIilcbiAgICAgID8gZGRvLnBhZ2UuYXR0cmlidXRlcy5jaGF0XG4gICAgICA6IHt9O1xuICBjb25zdCBnZW5lc3lzRGF0YUZuID0ge1xuICAgIHNpdGVJZDogKCkgPT4ge1xuICAgICAgd2luZG93LmlucVNpdGVJRCA9IGRkb0NoYXREYXRhLnNpdGVfaWQgfHwgZGRvQ2hhdERhdGEuU0lURV9JRCB8fCBudWxsO1xuICAgICAgcmV0dXJuIHdpbmRvdy5pbnFTaXRlSUQ7XG4gICAgfSxcbiAgICBsYW5ndWFnZTogKGRhdGE6IHtcbiAgICAgIHBhZ2U6IHtcbiAgICAgICAgcGFnZUluZm86IHN0cmluZyB8IGFueVtdO1xuICAgICAgICBhdHRyaWJ1dGVzOiB7IGNoYXQ6IHsgTEFOR1VBR0U6IGFueSB9IH07XG4gICAgICB9O1xuICAgIH0pID0+IHtcbiAgICAgIGxldCBsYW5ndWFnZSA9XG4gICAgICAgIGRhdGEucGFnZSAmJlxuICAgICAgICBkYXRhLnBhZ2UucGFnZUluZm8gJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhLnBhZ2UucGFnZUluZm8pICYmXG4gICAgICAgIGRhdGEucGFnZS5wYWdlSW5mby5sZW5ndGggPiAwXG4gICAgICAgICAgPyBkYXRhLnBhZ2UucGFnZUluZm9bMF0ubGFuZ3VhZ2VcbiAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGFuZ3VhZ2UgPT09IFwiXCIgJiZcbiAgICAgICAgdHlwZW9mIGZzZE5hdkNsaWVudE9wdGlvbnMgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgZnNkTmF2Q2xpZW50T3B0aW9uc1xuICAgICAgKSB7XG4gICAgICAgIGxhbmd1YWdlID0gZnNkTmF2Q2xpZW50T3B0aW9ucy5sb2NhbGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgbGFuZ3VhZ2UgPT09IFwiXCIgJiZcbiAgICAgICAgZGF0YS5wYWdlICYmXG4gICAgICAgIGRhdGEucGFnZS5hdHRyaWJ1dGVzICYmXG4gICAgICAgIGRhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXRcbiAgICAgICkge1xuICAgICAgICBsYW5ndWFnZSA9IGRhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQuTEFOR1VBR0U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgICBkaXNhYmxlQ2hhdDogKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5iYWN0bSkge1xuICAgICAgICBjb25zdCBjb29raWVzID0gbmV3IHdpbmRvdy5iYWN0bS5Db29raWVzKCk7XG4gICAgICAgIGNvbnN0IG1sbyA9IGNvb2tpZXMuZ2V0KFwiYm9hX2hsdHNfbWxvXCIpO1xuXG4gICAgICAgIGNvbnN0IHFzID0gbmV3IHdpbmRvdy5iYWN0bS5RdWVyeVN0cmluZygpO1xuICAgICAgICBjb25zdCBhZmZpbGlhdGVDb2RlID0gcXMuZ2V0KFwiYWZmaWxpYXRlY29kZVwiKTtcblxuICAgICAgICByZXR1cm4gISEobWxvIHx8IGFmZmlsaWF0ZUNvZGUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgT0lEOiAoZGF0YTogeyB1c2VyOiB7IG9ubGluZV9pZDogYW55IH0gfSkgPT5cbiAgICAgIGRhdGEudXNlciA/IGRhdGEudXNlci5vbmxpbmVfaWQgOiBcIlwiLFxuXG4gICAgYXV0aGVudGljYXRlZDogKGRhdGE6IHsgdXNlcjogeyBhdXRoZW50aWNhdGVkOiBhbnkgfSB9KSA9PiB7XG4gICAgICBjb25zdCBhdXRoZW50aWNhdGVkID0gZGF0YT8udXNlcj8uYXV0aGVudGljYXRlZFxuICAgICAgICA/IGRhdGEudXNlci5hdXRoZW50aWNhdGVkXG4gICAgICAgIDogZmFsc2U7XG4gICAgICByZXR1cm4gYXV0aGVudGljYXRlZDtcbiAgICB9LFxuICAgIGJ1aWxkTmFtZTogKFxuICAgICAgZGF0YTogeyB1c2VyOiB7IG5hbWU6IHsgZmlyc3Q6IHN0cmluZzsgbGFzdDogc3RyaW5nOyBmdWxsOiBzdHJpbmcgfSB9IH0sXG4gICAgICBmaWx0ZXI6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgbGV0IGZpcnN0TmFtZSA9IFwiXCI7XG4gICAgICBsZXQgbGFzdE5hbWUgPSBcIlwiO1xuICAgICAgbGV0IGZ1bGxOYW1lID0gXCJcIjtcblxuICAgICAgaWYgKGRhdGEudXNlciAmJiBkYXRhLnVzZXIubmFtZSkge1xuICAgICAgICBmaXJzdE5hbWUgPSBkYXRhLnVzZXIubmFtZS5maXJzdCB8fCBcIlwiO1xuICAgICAgICBsYXN0TmFtZSA9IGRhdGEudXNlci5uYW1lLmxhc3QgfHwgXCJcIjtcbiAgICAgICAgZnVsbE5hbWUgPSBkYXRhLnVzZXIubmFtZS5mdWxsIHx8IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZmlsdGVyKSB7XG4gICAgICAgIGNhc2UgXCJmaXJzdFwiOlxuICAgICAgICAgIGlmIChmaXJzdE5hbWUgPT09IFwiXCIgJiYgbGFzdE5hbWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTtcblxuICAgICAgICBjYXNlIFwibGFzdFwiOlxuICAgICAgICAgIHJldHVybiBsYXN0TmFtZTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmdWxsTmFtZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmlyc3ROYW1lOiAoZGF0YToge1xuICAgICAgdXNlcjogeyBuYW1lOiB7IGZpcnN0OiBzdHJpbmc7IGxhc3Q6IHN0cmluZzsgZnVsbDogc3RyaW5nIH0gfTtcbiAgICB9KSA9PiBnZW5lc3lzRGF0YUZuLmJ1aWxkTmFtZShkYXRhLCBcImZpcnN0XCIpLFxuXG4gICAgbGFzdE5hbWU6IChkYXRhOiB7XG4gICAgICB1c2VyOiB7IG5hbWU6IHsgZmlyc3Q6IHN0cmluZzsgbGFzdDogc3RyaW5nOyBmdWxsOiBzdHJpbmcgfSB9O1xuICAgIH0pID0+IGdlbmVzeXNEYXRhRm4uYnVpbGROYW1lKGRhdGEsIFwibGFzdFwiKSxcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICAgIGZpcnN0T2ZmZXI6IChkYXRhOiB7IHVzZXI6IHsgb2ZmZXJzOiBzdHJpbmcgfCBhbnlbXSB9IH0sIHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGRhdGEudXNlciAmJiBkYXRhLnVzZXIub2ZmZXJzICYmIGRhdGEudXNlci5vZmZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9mZmVyaWQgaW4gZGF0YS51c2VyLm9mZmVyc1swXSkge1xuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcImlkXCI6XG4gICAgICAgICAgICAgIHJldHVybiBvZmZlcmlkO1xuICAgICAgICAgICAgY2FzZSBcImNvZGVcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudXNlci5vZmZlcnNbMF1bb2ZmZXJpZF07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpcnN0T2ZmZXJJZDogKGRhdGE6IHsgdXNlcjogeyBvZmZlcnM6IHN0cmluZyB8IGFueVtdIH0gfSkgPT5cbiAgICAgIGdlbmVzeXNEYXRhRm4uZmlyc3RPZmZlcihkYXRhLCBcImlkXCIpLFxuXG4gICAgZmlyc3RPZmZlckNvZGU6IChkYXRhOiB7IHVzZXI6IHsgb2ZmZXJzOiBzdHJpbmcgfCBhbnlbXSB9IH0pID0+XG4gICAgICBnZW5lc3lzRGF0YUZuLmZpcnN0T2ZmZXIoZGF0YSwgXCJjb2RlXCIpLFxuXG4gICAgc3RhdGU6IChkYXRhOiB7IHVzZXI6IHsgc3RhdGU6IGFueSB9IH0pID0+XG4gICAgICBkYXRhLnVzZXIgPyBkYXRhLnVzZXIuc3RhdGUgOiBcIlwiLFxuXG4gICAgcHJvZHVjdE5hbWU6IChkYXRhOiB7IHByb2R1Y3Q6IHN0cmluZyB8IGFueVtdIH0pID0+IHtcbiAgICAgIGlmICghZGF0YS5wcm9kdWN0IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucHJvZHVjdCkpIHJldHVybiBcIlwiO1xuXG4gICAgICBjb25zdCBwcm9kdWN0TmFtZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5wcm9kdWN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2R1Y3ROYW1lcy5wdXNoKGRhdGEucHJvZHVjdFtpXS5wcm9kdWN0SW5mby5wcm9kdWN0TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9kdWN0TmFtZXMuam9pbihcIixcIik7XG4gICAgfSxcblxuICAgIGNhdGVnb3JpZXM6IChkYXRhOiB7IHByb2R1Y3Q6IHN0cmluZyB8IGFueVtdIH0pID0+IHtcbiAgICAgIGlmICghZGF0YS5wcm9kdWN0IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucHJvZHVjdCkpIHJldHVybiBcIlwiO1xuXG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEucHJvZHVjdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYXRlZ29yaWVzLnB1c2goZGF0YS5wcm9kdWN0W2ldLmNhdGVnb3J5LnByaW1hcnlDYXRlZ29yeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXRlZ29yaWVzLmpvaW4oXCIsXCIpO1xuICAgIH0sXG5cbiAgICBpbnFDbGllbnRPcmRlck51bTogKGRhdGE/OiB7IGNhcnQ6IHsgZnVsZmlsbWVudElEOiBhbnkgfSB9KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucUNsaWVudE9yZGVyTnVtO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgPT09IFwiW11cIikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgd2luZG93LmlucUNsaWVudE9yZGVyTnVtID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5jYXJ0ICYmIGRhdGEuY2FydC5mdWxmaWxtZW50SURcbiAgICAgICAgPyBkYXRhLmNhcnQuZnVsZmlsbWVudElEXG4gICAgICAgIDogXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xT3JkZXJUeXBlOiAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucU9yZGVyVHlwZTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIHdpbmRvdy5pbnFPcmRlclR5cGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xT3RoZXJJbmZvOiAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRkb0NoYXREYXRhLmlucU90aGVySW5mbztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIHdpbmRvdy5pbnFPdGhlckluZm8gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xU2FsZXNQcmljZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcmljZXM7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA9PT0gXCJbXVwiKSByZXR1cm4gXCJcIjtcblxuICAgICAgICB3aW5kb3cuaW5xU2FsZXNQcmljZXMgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgaW5xU2FsZXNQcm9kdWN0czogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcm9kdWN0cztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlID09PSBcIltdXCIpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW3ZhbHVlXTtcblxuICAgICAgICB3aW5kb3cuaW5xU2FsZXNQcm9kdWN0cyA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH0sXG5cbiAgICBpbnFTYWxlc1Byb2R1Y3RUeXBlczogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNQcm9kdWN0VHlwZXM7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0XG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSA9PT0gXCJbXVwiKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV07XG5cbiAgICAgICAgd2luZG93LmlucVNhbGVzUHJvZHVjdFR5cGVzID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSxcblxuICAgIGlucVNhbGVzUXVhbnRpdGllczogKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZGRvQ2hhdERhdGEuaW5xU2FsZXNRdWFudGl0aWVzO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdFxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUgPT09IFwiW11cIikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgdmFsdWUgPSBbdmFsdWVdO1xuXG4gICAgICAgIHdpbmRvdy5pbnFTYWxlc1F1YW50aXRpZXMgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuXG4gICAgcHJlZmVycmVkUmV3YXJkc1RpZXI6IChkYXRhOiB7IHVzZXI6IHsgcHJlZmVycmVkX3Jld2FyZHNfdGllcjogYW55IH0gfSkgPT5cbiAgICAgIGRhdGEudXNlciAmJiBkYXRhLnVzZXIucHJlZmVycmVkX3Jld2FyZHNfdGllclxuICAgICAgICA/IGRhdGEudXNlci5wcmVmZXJyZWRfcmV3YXJkc190aWVyXG4gICAgICAgIDogXCJcIixcblxuICAgIHBhZ2VJRDogKGRhdGE6IHsgcGFnZTogeyBwYWdlSW5mbzogc3RyaW5nIHwgYW55W10gfSB9KSA9PiB7XG4gICAgICAvLyBBc3N1bWluZyBkYXRhQ29sbGVjdG9yIGlzIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbiAnZXZlbnQnIHByb3BlcnR5XG4gICAgICBjb25zdCBkYXRhQ29sbGVjdG9yOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGRhdGE6IGFueSB9PiA9IEFycmF5LmlzQXJyYXkoXG4gICAgICAgIHdpbmRvdy5kYXRhQ29sbGVjdG9yXG4gICAgICApXG4gICAgICAgID8gd2luZG93LmRhdGFDb2xsZWN0b3JcbiAgICAgICAgOiBbXTsgLy8gRW5zdXJlIGRhdGFDb2xsZWN0b3IgaXMgYW4gYXJyYXlcbiAgICAgIGNvbnN0IHBhZ2VWaWV3cyA9IGRhdGFDb2xsZWN0b3IuZmlsdGVyKFxuICAgICAgICAoeyBldmVudCB9KSA9PiBldmVudCA9PT0gXCJwYWdldmlld1wiXG4gICAgICApO1xuICAgICAgY29uc3QgcGFnZVZpZXcgPVxuICAgICAgICBwYWdlVmlld3MgJiYgQXJyYXkuaXNBcnJheShwYWdlVmlld3MpICYmIHBhZ2VWaWV3cy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBwYWdlVmlld3Muc2xpY2UoLTEpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnBhZ2UgJiZcbiAgICAgICAgZGF0YS5wYWdlLnBhZ2VJbmZvICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YS5wYWdlLnBhZ2VJbmZvKSAmJlxuICAgICAgICBkYXRhLnBhZ2UucGFnZUluZm8ubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYWdlVmlldyAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkocGFnZVZpZXcpICYmXG4gICAgICAgICAgcGFnZVZpZXcubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIFwicGFnZUluZm9LZXlcIiBpbiBwYWdlVmlld1swXVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gXCJwYWdlSW5mb0tleVwiIGluIHBhZ2VWaWV3WzBdICYmXG4gICAgICAgICAgICB0eXBlb2YgcGFnZVZpZXdbMF0ucGFnZUluZm9LZXkgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGRhdGEucGFnZS5wYWdlSW5mb1tcbiAgICAgICAgICAgICAgcGFnZVZpZXdbMF0ucGFnZUluZm9LZXkgYXMga2V5b2YgdHlwZW9mIGRhdGEucGFnZS5wYWdlSW5mb1xuICAgICAgICAgICAgXT8ucGFnZUlEXG4gICAgICAgICAgICA/IGRhdGEucGFnZS5wYWdlSW5mb1tcbiAgICAgICAgICAgICAgICBwYWdlVmlld1swXS5wYWdlSW5mb0tleSBhcyBrZXlvZiB0eXBlb2YgZGF0YS5wYWdlLnBhZ2VJbmZvXG4gICAgICAgICAgICAgIF0/LnBhZ2VJRFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBkYXRhLnBhZ2UucGFnZUluZm9bMF0ucGFnZUlEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VhcmNoUXVlcnk6IChkYXRhOiB7IHBhZ2U6IHsgYXR0cmlidXRlczogeyBzZWFyY2hTdHJpbmc6IGFueSB9IH0gfSkgPT5cbiAgICAgIGRhdGEucGFnZSAmJiBkYXRhLnBhZ2UuYXR0cmlidXRlc1xuICAgICAgICA/IGRhdGEucGFnZS5hdHRyaWJ1dGVzLnNlYXJjaFN0cmluZ1xuICAgICAgICA6IFwiXCIsXG5cbiAgICBzZWFyY2hSZXN1bHQ6IChkYXRhOiB7IHBhZ2U6IHsgYXR0cmlidXRlczogeyBzZWFyY2hSZXN1bHRzOiBhbnkgfSB9IH0pID0+XG4gICAgICBkYXRhLnBhZ2UgJiYgZGF0YS5wYWdlLmF0dHJpYnV0ZXNcbiAgICAgICAgPyBkYXRhLnBhZ2UuYXR0cmlidXRlcy5zZWFyY2hSZXN1bHRzXG4gICAgICAgIDogXCJcIixcbiAgfTtcbiAgd2luZG93LmdlbmVzeXNEYXRhID0ge1xuICAgIEFDQ09VTlRfVFlQRTogZGRvQ2hhdERhdGEuYWNjb3VudF90eXBlLFxuICAgIEFQUExJQ0FUSU9OOiBnZW5lc3lzRGF0YUZuLnBhZ2VJRChkZG8pLFxuICAgIEFVVEhFTlRJQ0FURUQ6IGdlbmVzeXNEYXRhRm4uYXV0aGVudGljYXRlZChkZG8pLFxuICAgIEJPQV9BU1NPQ0lBVEU6IGRkb0NoYXREYXRhLmJvYV9hc3NvY2lhdGUsXG4gICAgQk9BX1JFVElSRUU6IGRkb0NoYXREYXRhLmJvYV9yZXRpcmVlLFxuICAgIENBTkNFTFJFQVNPTjogZGRvQ2hhdERhdGEuY2FuY2VsX3JlYXNvbixcbiAgICBDQVQ6IGdlbmVzeXNEYXRhRm4uY2F0ZWdvcmllcyhkZG8pLFxuICAgIENPTVBBTllfTkFNRTogZGRvQ2hhdERhdGEuY29tcGFueV9uYW1lLFxuICAgIENPTlZFUlNJT05fU1RBR0U6IGRkb0NoYXREYXRhLmNvbnZlcnNpb25fc3RhZ2UsXG4gICAgQ1VTVE9NRVJfTE9COiBkZG9DaGF0RGF0YS5jdXN0b21lcl9sb2IsXG4gICAgQ1VTVE9NRVJfU0VHTUVOVDogZGRvQ2hhdERhdGEuY3VzdG9tZXJfc2VnbWVudCxcbiAgICBEQVRBOiBkZG9DaGF0RGF0YS5kYXRhLFxuICAgIERJU0FCTEVfQ0hBVDogZ2VuZXN5c0RhdGFGbi5kaXNhYmxlQ2hhdCgpLFxuICAgIEVOVElUTEVNRU5UX0NPREU6IGRkb0NoYXREYXRhLmVudGl0bGVtZW50X2NvZGUsXG4gICAgRVJST1JfQ09VTlQ6IGRkb0NoYXREYXRhLmVycm9yX2NvdW50LFxuICAgIEZJUlNUX0xPR0lOOiBkZG9DaGF0RGF0YS5maXJzdF9sb2dpbixcbiAgICBGSVJTVE5BTUU6IGdlbmVzeXNEYXRhRm4uZmlyc3ROYW1lKGRkbyksXG4gICAgaW5xQ2xpZW50T3JkZXJOdW06IGdlbmVzeXNEYXRhRm4uaW5xQ2xpZW50T3JkZXJOdW0oKSxcbiAgICBpbnFPcmRlclR5cGU6IGdlbmVzeXNEYXRhRm4uaW5xT3JkZXJUeXBlKCksXG4gICAgaW5xT3RoZXJJbmZvOiBnZW5lc3lzRGF0YUZuLmlucU90aGVySW5mbygpLFxuICAgIGlucVNhbGVzUHJpY2VzOiBnZW5lc3lzRGF0YUZuLmlucVNhbGVzUHJpY2VzKCksXG4gICAgaW5xU2FsZXNQcm9kdWN0czogZ2VuZXN5c0RhdGFGbi5pbnFTYWxlc1Byb2R1Y3RzKCksXG4gICAgaW5xU2FsZXNQcm9kdWN0VHlwZXM6IGdlbmVzeXNEYXRhRm4uaW5xU2FsZXNQcm9kdWN0VHlwZXMoKSxcbiAgICBpbnFTYWxlc1F1YW50aXRpZXM6IGdlbmVzeXNEYXRhRm4uaW5xU2FsZXNRdWFudGl0aWVzKCksXG4gICAgaW5xU2l0ZUlEOiBnZW5lc3lzRGF0YUZuLnNpdGVJZCgpLFxuICAgIExBTkdVQUdFOiBnZW5lc3lzRGF0YUZuLmxhbmd1YWdlKGRkbyksXG4gICAgTEFTVE5BTUU6IGdlbmVzeXNEYXRhRm4ubGFzdE5hbWUoZGRvKSxcbiAgICBOQU06IGdlbmVzeXNEYXRhRm4ucHJvZHVjdE5hbWUoZGRvKSxcbiAgICBPTkxJTkVfSUQ6IGdlbmVzeXNEYXRhRm4uT0lEKGRkbyksXG4gICAgT0ZSOiBnZW5lc3lzRGF0YUZuLmZpcnN0T2ZmZXJJZChkZG8pLFxuICAgIE9GRkVSX0NPREU6IGdlbmVzeXNEYXRhRm4uZmlyc3RPZmZlckNvZGUoZGRvKSxcbiAgICBQQUdFX1RZUEU6IGRkb0NoYXREYXRhLlBhZ2VUeXBlLFxuICAgIFBBR0VfTE9BRFRJTUU6IGRkb0NoYXREYXRhLnBhZ2VfbG9hZHRpbWUsXG4gICAgUFJFRkVSUkVEX1JFV0FSRFNfVElFUjogZ2VuZXN5c0RhdGFGbi5wcmVmZXJyZWRSZXdhcmRzVGllcihkZG8pLFxuICAgIFBSRVFVQUxJRklDQVRJT046IGdlbmVzeXNEYXRhRm4ucGFnZUlEKGRkbyksXG4gICAgUFJPRFVDVF9ESVNQTEFZOiBnZW5lc3lzRGF0YUZuLnByb2R1Y3ROYW1lKGRkbyksXG4gICAgUFJPRFVDVF9UWVBFOiBkZG9DaGF0RGF0YS5Qcm9kdWN0X3R5cGUsXG4gICAgUFJPRFVDVF9WSUVXOiBnZW5lc3lzRGF0YUZuLnByb2R1Y3ROYW1lKGRkbyksXG4gICAgUFJPRFVDVFNFTEVDVElPTl9QVVJDSEFTRUZMT1c6IGdlbmVzeXNEYXRhRm4ucGFnZUlEKGRkbyksXG4gICAgUkVGRVJSQUxfQ0FNUEFJR046IGRkb0NoYXREYXRhLnJlZmVycmFsX2NhbXBhaWduLFxuICAgIFNUQVRFOiBnZW5lc3lzRGF0YUZuLnN0YXRlKGRkbyksXG4gICAgU1VCX1NFQ1RJT046IGRkb0NoYXREYXRhLlN1Yl9TZWN0aW9uLFxuICAgIFRJTUVaT05FOiBkZG9DaGF0RGF0YS50aW1lem9uZSxcbiAgICBUT09MX0lOVEVSTkFMU0VBUkNIUVVFUlk6IGdlbmVzeXNEYXRhRm4uc2VhcmNoUXVlcnkoZGRvKSxcbiAgICBUT09MX0lOVEVSTkFMU0VBUkNIUkVTVUxUOiBnZW5lc3lzRGF0YUZuLnNlYXJjaFJlc3VsdChkZG8pLFxuICAgIFRPUElDX1NFTEVDVElPTjogZGRvQ2hhdERhdGEudG9waWNfc2VsZWN0aW9uLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGVtcHR5ID1cbiAgICAgIHZhbHVlID09PSBcIlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhaXNFbXB0eUFycih2YWx1ZSkgfHxcbiAgICAgICFpc0VtcHR5T2JqKHZhbHVlKTtcblxuICAgIHJldHVybiAhZW1wdHk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGl0ZW0gaW4gZ2VuZXN5c0RhdGEpIHtcbiAgICBpZiAodmFsaWRhdGVWYWx1ZSgoZ2VuZXN5c0RhdGEgYXMgUmVjb3JkPHN0cmluZywgYW55PilbaXRlbV0pKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgKGdlbmVzeXNEYXRhIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2l0ZW1dO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVsb2FkKCkge1xuICBpZiAod2hpY2hEb21haW4oKSA9PT0gTUVSUklMTCB8fCB3aGljaERvbWFpbigpID09PSBJTlRFUk5BTCkge1xuICAgIHdpbmRvdy5nZW5lc3lzRGF0YSA9IHt9O1xuICAgIHdpbmRvdy5nZW5lc3lzRGF0YSA9XG4gICAgICBiYWN0bSAmJiBiYWN0bS5kZG9cbiAgICAgICAgPyBiYWN0bS5kZG8uZ2V0KFwicGFnZS5hdHRyaWJ1dGVzLmNoYXRcIilcbiAgICAgICAgOiBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZG8gPSB3aW5kb3cuZGlnaXRhbERhdGE7XG4gICAgX3ByZXBhcmVEYXRhKGRkbyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5pdGlhbGl6ZSgpIHtcbiAgaWYgKHdoaWNoRG9tYWluKCkgPT09IE1FUlJJTEwgfHwgd2hpY2hEb21haW4oKSA9PT0gSU5URVJOQUwpIHtcbiAgICB3aW5kb3cuZ2VuZXN5c0RhdGEgPSB7fTtcbiAgICB3aW5kb3cuZ2VuZXN5c0RhdGEgPVxuICAgICAgYmFjdG0gJiYgYmFjdG0uZGRvXG4gICAgICAgID8gYmFjdG0uZGRvLmdldChcInBhZ2UuYXR0cmlidXRlcy5jaGF0XCIpXG4gICAgICAgIDogZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgcmVmcmVzaEdlbmVzeXNEYXRhID0gc2V0SW50ZXJ2YWwoX3JlbG9hZCwgMTUwMDApO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRkbyA9IHdpbmRvdy5kaWdpdGFsRGF0YTtcbiAgICBfcHJlcGFyZURhdGEoZGRvKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCByZWZyZXNoR2VuZXN5c0RhdGEgPSBzZXRJbnRlcnZhbChfcmVsb2FkLCAxNTAwMCk7XG4gIH1cbn1cbndpbmRvdy5ib2EgPSB3aW5kb3cuYm9hIHx8IHt9O1xud2luZG93LmJvYS5jaGF0ID0ge1xuICBpbml0OiBfaW5pdGlhbGl6ZSxcbiAgcmVsb2FkOiBfcmVsb2FkLFxufTtcbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHNhbGVzL2dyYWItZGF0YSAqL1xuaW1wb3J0IHtcbiAgTU9OSVRPUklOR0pTX0hFQVJUQkVBVCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWxcbiAqIEBwYXJhbSAge0FycmF5fSAgIGFycjEgVGhlIGZpcnN0IGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gICBhcnIyIFRoZSBzZWNvbmQgYXJyYXlcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgSWYgdHJ1ZSwgYm90aCBhcnJheXMgYXJlIGVxdWFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBhcnJheXNNYXRjaCA9IGZ1bmN0aW9uIGNoZWNrQXJycyhhcnIxOiBhbnlbXSwgYXJyMjogYW55W10pOiBib29sZWFuIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIGFycmF5cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXG4gIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAvLyBDaGVjayBpZiBhbGwgaXRlbXMgZXhpc3QgYW5kIGFyZSBpbiB0aGUgc2FtZSBvcmRlclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gdHJ1ZVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ29tcGFyZSB0d28gaXRlbXMgYW5kIHB1c2ggbm9uLW1hdGNoZXMgdG8gb2JqZWN0XG4gKiBAcGFyYW0gIHsqfSAgICAgIGl0ZW0xIFRoZSBmaXJzdCBpdGVtXG4gKiBAcGFyYW0gIHsqfSAgICAgIGl0ZW0yIFRoZSBzZWNvbmQgaXRlbVxuICogQHBhcmFtICB7U3RyaW5nfSBrZXkgICBUaGUga2V5IGluIG91ciBvYmplY3RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRpZmZzIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYmplY3RzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBjb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZUl0ZW1zKGl0ZW0xOiBhbnlbXSwgaXRlbTI6IGFueVtdLCBrZXk6IHN0cmluZywgZGlmZnM6IG9iamVjdCk6IG9iamVjdCB7XG4gIC8vIEdldCB0aGUgb2JqZWN0IHR5cGVcbiAgY29uc3QgdHlwZTEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbTEpO1xuICBjb25zdCB0eXBlMiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVtMik7XG5cbiAgLy8gSWYgdHlwZTIgaXMgdW5kZWZpbmVkIGl0IGhhcyBiZWVuIHJlbW92ZWRcbiAgaWYgKHR5cGUyID09PSAnW29iamVjdCBVbmRlZmluZWRdJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGRpZmZzW2tleV0gPSBudWxsO1xuICB9XG5cbiAgLy8gSWYgaXRlbXMgYXJlIGRpZmZlcmVudCB0eXBlc1xuICBpZiAodHlwZTEgIT09IHR5cGUyKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgZGlmZnNba2V5XSA9IGl0ZW0yO1xuICB9XG5cbiAgLy8gSWYgYW4gb2JqZWN0LCBjb21wYXJlIHJlY3Vyc2l2ZWx5XG4gIGlmICh0eXBlMSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICBjb25zdCBvYmpEaWZmID0gZGlmZihpdGVtMSwgaXRlbTIpO1xuICAgIGlmIChPYmplY3Qua2V5cyhvYmpEaWZmKS5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIGRpZmZzW2tleV0gPSBvYmpEaWZmO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIGFuIGFycmF5LCBjb21wYXJlXG4gIGlmICh0eXBlMSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgIGlmICghYXJyYXlzTWF0Y2goaXRlbTEsIGl0ZW0yKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gICAgfVxuICB9XG5cbiAgLy8gRWxzZSBpZiBpdCdzIGEgZnVuY3Rpb24sIGNvbnZlcnQgdG8gYSBzdHJpbmcgYW5kIGNvbXBhcmVcbiAgLy8gT3RoZXJ3aXNlLCBqdXN0IGNvbXBhcmVcbiAgaWYgKHR5cGUxID09PSAnW29iamVjdCBGdW5jdGlvbl0nKSB7XG4gICAgaWYgKGl0ZW0xLnRvU3RyaW5nKCkgIT09IGl0ZW0yLnRvU3RyaW5nKCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgZGlmZnNba2V5XSA9IGl0ZW0yO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpdGVtMSAhPT0gaXRlbTIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBkaWZmc1trZXldID0gaXRlbTI7XG4gIH1cblxuICByZXR1cm4gZGlmZnM7XG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIG9iamVjdHMgYW5kIHB1c2ggdG8gYSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iajEgVGhlIG9yaWdpbmFsIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmoyIFRoZSBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0IGl0XG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgQW4gb2JqZWN0IG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3b1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgZGlmZiA9IGZ1bmN0aW9uIGZpbmREaWZmZXJlbmNlcyhvYmoxOiBvYmplY3QsIG9iajI/OiBvYmplY3QpOiBvYmplY3Qge1xuICAvLyBNYWtlIHN1cmUgYW4gb2JqZWN0IHRvIGNvbXBhcmUgaXMgcHJvdmlkZWRcbiAgaWYgKCFvYmoyIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmoyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gb2JqMTtcbiAgfVxuXG4gIC8vIFZhcmlhYmxlc1xuICBsZXQgZGlmZnMgPSB7fTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGZpcnN0IG9iamVjdFxuICBmb3IgKGxldCBpID0gMCwga2V5cyA9IE9iamVjdC5rZXlzKG9iajEpOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGRpZmZzID0gY29tcGFyZShvYmoxW2tleXNbaV1dLCBvYmoyW2tleXNbaV1dLCBrZXlzW2ldLCBkaWZmcyk7XG4gIH1cblxuICAvLyBMb29wIHRocm91Z2ggdGhlIHNlY29uZCBvYmplY3QgYW5kIGZpbmQgbWlzc2luZyBpdGVtc1xuICBmb3IgKGxldCBpID0gMCwga2V5cyA9IE9iamVjdC5rZXlzKG9iajIpOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghb2JqMVtrZXlzW2ldXSAmJiBvYmoxW2tleXNbaV1dICE9PSBvYmoyW2tleXNbaV1dKSB7XG4gICAgICBkaWZmc1trZXlzW2ldXSA9IG9iajJba2V5c1tpXV07XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSBvYmplY3Qgb2YgZGlmZmVyZW5jZXNcbiAgcmV0dXJuIGRpZmZzO1xufTtcblxuLyoqXG4gKiBIYW5kbGUgZ3JhYmJpbmcgZGF0YVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlR3JhYkRhdGEoZGF0YTogb2JqZWN0LCBrZXlib2FyZFRpbWVzdGFtcDogbnVtYmVyLCBtb3VzZVRpbWVzdGFtcDogbnVtYmVyKTogb2JqZWN0IHtcbiAgbGV0IG5ld0RhdGE7XG4gIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBkYXRhID0gd2luZG93LmdlbmVzeXNEYXRhO1xuICB9IGVsc2Uge1xuICAgIG5ld0RhdGEgPSB3aW5kb3cuZ2VuZXN5c0RhdGE7XG4gIH1cblxuICBjb25zdCBkZWx0YURhdGEgPSBkaWZmKGRhdGEsIG5ld0RhdGEpO1xuICBjb25zdCB1c2VyS2V5Ym9hcmRBY3Rpdml0eSA9IGtleWJvYXJkVGltZXN0YW1wO1xuICBjb25zdCB1c2VyTW91c2VBY3Rpdml0eSA9IG1vdXNlVGltZXN0YW1wO1xuICBsZXQgZGF0YVRvU2VuZDtcblxuICBpZiAodXNlcktleWJvYXJkQWN0aXZpdHkgJiYgdXNlck1vdXNlQWN0aXZpdHkpIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgICAgdXNlcktleWJvYXJkQWN0aXZpdHksXG4gICAgICB1c2VyTW91c2VBY3Rpdml0eSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHVzZXJLZXlib2FyZEFjdGl2aXR5KSB7XG4gICAgZGF0YVRvU2VuZCA9IHtcbiAgICAgIC4uLmRlbHRhRGF0YSxcbiAgICAgIHVzZXJLZXlib2FyZEFjdGl2aXR5LFxuICAgIH07XG4gIH0gZWxzZSBpZiAodXNlck1vdXNlQWN0aXZpdHkpIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgICAgdXNlck1vdXNlQWN0aXZpdHksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhVG9TZW5kID0ge1xuICAgICAgLi4uZGVsdGFEYXRhLFxuICAgIH07XG4gIH1cblxuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goTU9OSVRPUklOR0pTX0hFQVJUQkVBVCwgZGF0YVRvU2VuZCk7XG5cbiAgY29uc3QgbmV3T3JpZ2luYWxEYXRhID0ge1xuICAgIC4uLmRhdGEsXG4gICAgLi4ubmV3RGF0YSxcbiAgfTtcblxuICByZXR1cm4gbmV3T3JpZ2luYWxEYXRhO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgc2FsZXMvaGVhcnRiZWF0ICovXG5pbXBvcnQge1xuICBNT05JVE9SSU5HSlNfSEVBUlRCRUFUX0ZBSUxVUkUsXG4gIFBJWEVMX1RBR19VUkwsXG59IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIERpZ2l0YWxEYXRhT2JqZWN0IGlzIG1lcmdlZCB3aXRoIFRDRGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXlsb2FkIC0gaGVhcnRiZWF0IGRhdGEgKERETyBEYXRhIFZhbHVlcylcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZXZlbnROYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZykge1xuICB0cnkge1xuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnTW9uaXRvcmluZyBIZWFydGJlYXQnLCBwYXlsb2FkKTtcbiAgICBfZ3QucHVzaChbJ2V2ZW50JywgJ2hlYXJ0YmVhdCcsIHsgZGF0YTogcGF5bG9hZCB9XSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ01vbml0b3JpbmcgSGVhcnRiZWF0IEVycm9yJywgZSk7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKE1PTklUT1JJTkdKU19IRUFSVEJFQVRfRkFJTFVSRSwgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7Y2hhdFNpdGVQYXJhbXMsIEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSwgR0VORVNZU19SRVFVRVNUX1RDX1VQREFURV9TVUNDRVNTLCBHRU5FU1lTX1VQREFURV9DSEFUX0RBVEFfRU5EUE9JTlQsIFBJWEVMX1RBR19VUkwsIFNJVEVfSU5GT19BVkFJTEFCTEV9IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5pbXBvcnQge2dldEN1cnJlbnREb21haW4sIGdldEdTSUQsIGluY3JlYXNlRXJyb3JDb3VudCwgbG9nR2VuZXN5c0V2ZW50LCBwdWJsaXNoV2luZG93fSBmcm9tIFwiLi4vdXRpbGl0aWVzL3V0aWxpdGllc1wiO1xuaW1wb3J0IG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UgZnJvbSAnLi4vdXRpbGl0aWVzL2xvZ2dlcic7XG5cbi8qKlxuICogRXJyb3IgdGMtdXBkYXRlIEV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgLSBFcnJvciByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclRDVXBkYXRlRXZlbnQocmVzcG9uc2U6IGFueSkge1xuICBwdWJsaXNoV2luZG93KEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSwgcmVzcG9uc2UpXG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIHtcbiAgICBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke3Jlc3BvbnNlfWApO1xuICB9XG4gIG1vYmlsZUFDU0xvZ2dlclNlcnZpY2UoJ3VwZGF0ZUNoYXREYXRhJywgcmVzcG9uc2UpO1xuICBsb2dHZW5lc3lzRXZlbnQoMywgJ1RDLVVwZGF0ZSBSZXF1ZXN0IEZhaWx1cmUnLCByZXNwb25zZSk7XG4gIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICByZXR1cm4gZmFsc2U7XG5cbn1cblxuLyoqXG4gKiBTdWNjZXNzIHRjLXVwZGF0ZSBFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIC0gU3VjY2VzcyBSZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBcbiAqIHN1Y2Nlc3MgcmVzcG9uc2VcbiAqIHtcbiAqICBcIlJlYXNvblwiOiBcIlN1Y2Nlc3NmdWxseSBVcGRhdGVkXCIsXG4gKiAgXCJJZFwiOiBcIlRCS0tPNTNKSkgyNlAyMjdBOUtDQjhCTkhHMDAwVUNBXCIsXG4gKiAgXCJJc0NoYXRBY3RpdmVcIjogXCJOXCJcbiAqICAgIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2Nlc3NUQ1VwZGF0ZUV2ZW50KHJlc3BvbnNlOiBvYmplY3QpIHtcbiAgcHVibGlzaFdpbmRvdyhHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX1NVQ0NFU1MsIHJlc3BvbnNlKTtcbiAgbG9nR2VuZXN5c0V2ZW50KDEsICdHRU5FU1lTIFJFUVVFU1QgVEMgVVBEQVRFIFNVQ0NFU1MnLCByZXNwb25zZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBNYWtlcyB0ZXJtcyBhbmQgY29uZGl0aW9ucyB1cGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gcGF5bG9hZCAtIG5hbWUgb2YgZXZlbnRcbiAqIHBheWxvYWQgZXhhbXBsZVxuICogXCJ7XFxcIk9GRkVSX01HTVRcXFwiOlt7XFxcImN1cnJlbnRVcmxcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvcHJvZHVjdHMvY2FzaC1iYWNrLWNyZWRpdC1jYXJkLz9jYW1wYWlnbj00MDYzNzc4fkVLfmVuX1VTXFxcIixcXFwicmVmZXJyZXJcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvXFxcIixcXFwicHJvZHVjdE5hbWVcXFwiOlxcXCJCYW5rIG9mIEFtZXJpY2EgQ3VzdG9taXplZCBDYXNoIFJld2FyZHMgQ3JlZGl0IENhcmRcXFwiLFxcXCJ0Y0xpbmtcXFwiOlxcXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbS9jcmVkaXQtY2FyZHMvdGVybXMtYW5kLWNvbmRpdGlvbnMvP2NhbXBhaWduaWQ9NDA2Mzc3OCZwcm9kdWN0b2ZmZXJjb2RlPUVLJmxvY2FsZT1lbl9VU1xcXCIsXFxcInRpbWVTdGFtcFxcXCI6XFxcIjE6Mzc6MzEgUE1cXFwiLFxcXCJwYWdlVHlwZVxcXCI6XFxcInJlc2VhcmNoXFxcIn0se1xcXCJjdXJyZW50VXJsXFxcIjpcXFwiaHR0cHM6Ly93d3cuYmFua29mYW1lcmljYS5jb20vY3JlZGl0LWNhcmRzL3Byb2R1Y3RzL3VubGltaXRlZC1jYXNoLWJhY2stc3R1ZGVudC1jcmVkaXQtY2FyZC9cXFwiLFxcXCJyZWZlcnJlclxcXCI6XFxcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL2NyZWRpdC1jYXJkcy9zdHVkZW50LWNyZWRpdC1jYXJkcy9cXFwiLFxcXCJwcm9kdWN0TmFtZVxcXCI6XFxcIkJhbmsgb2YgQW1lcmljYSBVbmxpbWl0ZWQgQ2FzaCBSZXdhcmRzIENyZWRpdCBDYXJkIGZvciBTdHVkZW50c1xcXCIsXFxcInRjTGlua1xcXCI6XFxcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL2NyZWRpdC1jYXJkcy90ZXJtcy1hbmQtY29uZGl0aW9ucy8/Y2FtcGFpZ25pZD00MDYzOTIyJnByb2R1Y3RvZmZlcmNvZGU9UzcmbG9jYWxlPWVuX1VTXFxcIixcXFwidGltZVN0YW1wXFxcIjpcXFwiMTo0ODowOCBQTVxcXCIsXFxcInBhZ2VUeXBlXFxcIjpcXFwicmVzZWFyY2hcXFwifV19XCJcblxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZXZlbnQ6IG9iamVjdCwge1xuICBjaGF0SUQsXG4gIE9GRkVSX01HTVRcbn06IHtjaGF0SUQ6IHN0cmluZywgT0ZGRVJfTUdNVDogb2JqZWN0fSkge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2YgYmFjdG0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dFTkVTWVMgUkVRVUVTVCBUQyBVUERBVEUgUkVRVUVTVCB1bmFibGUgdG8gcHJvY2VzcycpXG4gICAgfVxuICAgIGNvbnN0IGdlbmVzeXNEYXRhID0ge1xuICAgICAgT0ZGRVJfTUdNVFxuICAgIH07XG4gICAgaWYgKGNoYXRJRCAmJiBPRkZFUl9NR01UKSB7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbklEID0gY2hhdElEO1xuICAgICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAgIGNvbnN0IEdTSUQgPSBnZXRHU0lEKCk7XG4gICAgICBjb25zdCBqc29uVXNlckRhdGEgPSBKU09OLnN0cmluZ2lmeShnZW5lc3lzRGF0YSlcbiAgICAgIGNvbnN0IGdlbmVzeXNUQ1VwZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgX2ludGVyYWN0aW9uX2lkOiBpbnRlcmFjdGlvbklELFxuICAgICAgICBfdXNlcmRhdGE6IGpzb25Vc2VyRGF0YSxcbiAgICAgICAgX0dTSUQ6IEdTSUQsXG4gICAgICAgIF91cGRhdGVGb3JBY3RpdmVDaGF0T25seTogJ1knXG4gICAgICB9O1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdHRU5FU1lTIFRFUk1TIEFORCBDT05ESVRJT05TIFVQREFURSBQQVJBTVMnLCBnZW5lc3lzVENVcGRhdGVQYXJhbXMpO1xuXG4gICAgICBjb25zdCBmaXJlVENDaGVjayA9IChldmVudDogc3RyaW5nLCBjaGF0U2l0ZVNwYVBhcmFtczogeyBzaXRlUGFyYW1zOiB7ZG9tYWluczoge319fSkgPT4ge1xuICAgICAgICBjb25zdCBnZW5lc3lzTmF0aXZlQ2hhdEVuZHBvaW50ID0gYCR7Y2hhdFNpdGVTcGFQYXJhbXNbY3VycmVudFRMRF0uZ2VuZXN5c30ke0dFTkVTWVNfVVBEQVRFX0NIQVRfREFUQV9FTkRQT0lOVH1gO1xuICAgICAgICBmZXRjaChnZW5lc3lzTmF0aXZlQ2hhdEVuZHBvaW50LCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZ2VuZXN5c1RDVXBkYXRlUGFyYW1zKSxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnXG4gICAgICAgIH0pLnRoZW4oKHJlc3ApID0+IHJlc3AuanNvbigpKS50aGVuKHN1Y2Nlc3NUQ1VwZGF0ZUV2ZW50KS5jYXRjaChlcnJvclRDVXBkYXRlRXZlbnQpXG4gICAgICB9XG4gICAgICAvLyBpZiBjaGF0U2l0ZSBwYXJhbXMgaGF2ZSBub3QgYmVlbiByZWNlaXZlZFxuICAgICAgaWYgKCFjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpIHtcbiAgICAgICAgICAvLyB3YWl0IGZvciBTSVRFX0lORk9fQVZBSUxBQkxFIGV2ZW50LCB0aGVuIGZpcmUgZmV0Y2ggcmVxdWVzdFxuICAgICAgICAgIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKFNJVEVfSU5GT19BVkFJTEFCTEUsIChldmVudE5hbWU6IHN0cmluZywgZGF0YTogYW55KSA9PiB7IGZpcmVUQ0NoZWNrKFNJVEVfSU5GT19BVkFJTEFCTEUsIGRhdGEpIH0pXG4gICAgICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGZXRjaGluZyBjaGF0U2l0ZVBhcmFtcyBmb3IgVEMgQ2FsbCcsIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmaXJlIGZldGNoIHJlcXVlc3RcbiAgICAgICAgICBmaXJlVENDaGVjayhTSVRFX0lORk9fQVZBSUxBQkxFLCBjaGF0U2l0ZVBhcmFtcy5zcGFQYXJhbXMpXG4gICAgICAgICAgbG9nR2VuZXN5c0V2ZW50KDEsICdGaXJpbmcgVEMgVXBkYXRlIEZldGNoIHJlcXVlc3QnLCBjaGF0U2l0ZVBhcmFtcylcbiAgICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDMsICdDaGF0IElEIHVuZGVmaW5lZCcsIGNoYXRJRClcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclRDVXBkYXRlRXZlbnQoZSlcbiAgfVxuXG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqIEBtb2R1bGUgc2FsZXMvcmVxdWVzdCAqL1xuaW1wb3J0IHtcbiAgTU9OSVRPUklOR0pTX1JFU1BPTlNFLFxuICBNT05JVE9SSU5HSlNfUkVTUE9OU0VfRkFJTFVSRSxcbiAgTU9OSVRPUklOR19JRF9SRVNQT05TRSxcbiAgUElYRUxfVEFHX1VSTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZSBtb25pdG9yaW5nSlMgeG1sLCBhbmQgZ3RjaiBmb3IgaGVhcnRiZWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IHJlcXVlc3RDb25maWd1cmF0aW9uIC0gZG9tYWluIGFuZCBVUkkgZHNsUmVzb3VyY2UgfCBodHRwRW5kcG9pbnQgfCBodHRwc0VuZHBvaW50IHwgZ3RjakVuZHBvaW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGV2ZW50TmFtZTogc3RyaW5nLCByZXF1ZXN0Q29uZmlndXJhdGlvbjogeyBodHRwc0VuZHBvaW50OiBzdHJpbmc7IGh0dHBFbmRwb2ludDogc3RyaW5nOyByZXNvdXJjZVBhdGg6IHN0cmluZzsgZ3RjakVuZHBvaW50OiBzdHJpbmc7IH0pID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpc01vbml0b3JpbmcgPSBiYWN0bS5kZG8uZ2V0KCdwYWdlLmF0dHJpYnV0ZXMuY2hhdC5tb25pdG9yaW5nJyk7XG4gICAgaWYoaXNNb25pdG9yaW5nKSByZXR1cm47XG4gICAgd2luZG93Ll9ndCA9IHdpbmRvdy5fZ3QgfHwgW107XG4gICAgY29uc3Qge1xuICAgICAgaHR0cHNFbmRwb2ludCwgaHR0cEVuZHBvaW50LCByZXNvdXJjZVBhdGgsIGd0Y2pFbmRwb2ludCxcbiAgICB9ID0gcmVxdWVzdENvbmZpZ3VyYXRpb247XG4gICAgY29uc3QgcHJvdG9jb2wgPSAoZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHNFbmRwb2ludCA6IGh0dHBFbmRwb2ludCk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGRzbFJlc291cmNlOiBgJHtwcm90b2NvbH0vJHtyZXNvdXJjZVBhdGh9YCxcbiAgICAgIGh0dHBFbmRwb2ludCxcbiAgICAgIGh0dHBzRW5kcG9pbnQsXG4gICAgICBndGNqRW5kcG9pbnQsXG4gICAgfTtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMSwgJ01vbml0b3JpbmcgUmVxdWVzdCcsIHJlcXVlc3RDb25maWd1cmF0aW9uKTtcbiAgICAvLyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIC8vIE1heSByZW1vdmUgdGhpcyBzZWN0aW9uIGJlY2F1c2UgdGhlIGRvbWFpbi14bWwubWlucy5qcyBpcyBiZWluZyBwb3N0ZWQgdHdpY2UuXG4gICAgLy8gVGhpcyBwYXJ0aWN1bGFyIHBvc3RpbmcgaGFzIG5vIHZhcmlhYmxlcyB3aXRoIHRoZSBwb3N0aW5nLCBzbyBpbml0aWFsIGFuYWx5c2lzIHBvaW50cyB0byBubyBmdW5jdGlvbmFsIHZhbHVlLiBcbiAgICBfZ3QucHVzaChbJ2NvbmZpZycsIGNvbmZpZ3VyYXRpb25dKTtcbiAgICAoZnVuY3Rpb24gKGQsIHMsIGlkLCBvKSB7XG4gICAgICBjb25zdCBmcyA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF07IGxldFxuICAgICAgICBlO1xuICAgICAgaWYgKGQuZ2V0RWxlbWVudEJ5SWQoaWQpKSByZXR1cm47XG4gICAgICBlID0gZC5jcmVhdGVFbGVtZW50KHMpIGFzIEhUTUxTY3JpcHRFbGVtZW50OyBlLmlkID0gaWQ7IGUuc3JjID0gby5zcmM7XG4gICAgICBmcy5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoZSwgZnMpO1xuICAgIH0oZG9jdW1lbnQsICdzY3JpcHQnLCAnZG9tYWluLXhtbCcsIHtcbiAgICAgIHNyYzogY29uZmlndXJhdGlvbi5kc2xSZXNvdXJjZSxcbiAgICB9KSk7XG4gICAgLy8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cblxuICAgIF9ndC5wdXNoKFsnZ2V0SURzJywgKElEczogb2JqZWN0KSA9PiB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZ3MgPSBuZXcgYmFjdG0uUXVlcnlTdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgY29uc3QgY29va2llcyA9IG5ldyBiYWN0bS5Db29raWVzKCdvY2N0Q2hhdCcpO1xuICAgICAgY29uc3QgY2hlY2tDb29raWUgPSBjb29raWVzLmdldCgnb2NjdENoYXQnKTtcbiAgICAgIGNvbnN0IG9jY3RDaGF0Q29va2llID0gSlNPTi5wYXJzZShjaGVja0Nvb2tpZSk7XG4gICAgICBjb25zdCBkZXRlcm1pbmVOYXRpdmVDaGF0ID0gKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCduYXRpdmVDaGF0PWF2YWlsYWJsZScpID8gJ2F2YWlsYWJsZScgOiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ25hdGl2ZUNoYXQ9YWN0aXZlJykgPyAnYWN0aXZlJyA6IGZhbHNlKSApIC8vIG5lZWQgdGhpcyBiZWNhdXNlIGJhY3RtLnF1ZXJ5c3RyaW5nIGlzIHRocm93biBvZmYgYnkgd2VpcmQgdXJscy5cbiAgICAgIGNvbnN0IGRldGVybWluZUNoYXRJRCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMV0pIHtcbiAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVsxXS5zcGxpdCgnY2hhdElEPScpWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVsxXS5zcGxpdCgnY2hhdElEPScpWzFdLnNwbGl0KCcmJylbMF0uc3BsaXQoJyMnKVswXTtcbiAgICAgICAgICB9ICBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyBcbiAgICAgIH07XG5cbiAgICAgIC8vIFRPRE9TOiBXaWxsIGxvb2sgYXQgdGhpcyBsYXRlclxuICAgICAgLy8gY29uc3QgbmF0aXZlQ2hhdCA9IG9jY3RDaGF0Q29va2llPy5uYXRpdmVDaGF0IHx8IHF1ZXJ5U3RyaW5ncy5nZXQoJ25hdGl2ZUNoYXQnKSB8fCBkZXRlcm1pbmVOYXRpdmVDaGF0O1xuICAgICAgLy8gY29uc3QgY2hhdElEID0gb2NjdENoYXRDb29raWU/LmNoYXRJRCB8fCBxdWVyeVN0cmluZ3MuZ2V0KCdjaGF0SUQnKSB8fCBkZXRlcm1pbmVDaGF0SUQoKTtcblxuICAgICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKE1PTklUT1JJTkdfSURfUkVTUE9OU0UsIHsgLi4uSURzIH0pO1xuICAgIH1dKTtcblxuXG4gICAgKGZ1bmN0aW9uIChkLCBzLCBpZCwgbykge1xuICAgICAgY29uc3QgZnMgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpWzBdOyBsZXRcbiAgICAgICAgZTtcbiAgICAgIGlmIChkLmdldEVsZW1lbnRCeUlkKGlkKSkgcmV0dXJuO1xuICAgICAgZSA9IGQuY3JlYXRlRWxlbWVudChzKSBhcyBIVE1MU2NyaXB0RWxlbWVudDsgZS5pZCA9IGlkOyBlLnNyYyA9IG8uc3JjO1xuICAgICAgZnMucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGUsIGZzKTtcbiAgICB9KGRvY3VtZW50LCAnc2NyaXB0JywgJ19ndCcsIHtcbiAgICAgIHNyYzogYCR7Y29uZmlndXJhdGlvbi5odHRwc0VuZHBvaW50fS8ke2NvbmZpZ3VyYXRpb24uZ3RjakVuZHBvaW50fWAsXG4gICAgfSkpO1xuXG5cbiAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goTU9OSVRPUklOR0pTX1JFU1BPTlNFLCB7fSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgYE1vbml0b3JpbmcgUmVxdWVzdCBFcnJvcmAsIGUpO1xuICAgIFRlYWxpdW1QdWJTdWIucHVibGlzaChNT05JVE9SSU5HSlNfUkVTUE9OU0VfRkFJTFVSRSwgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07IiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgc2FsZXMvcmVzcG9uc2UgKi9cbmltcG9ydCBncmFiRGF0YSBmcm9tICcuL2dyYWItZGF0YSc7XG5pbXBvcnQge1xuICBHRU5FU1lTX1NVU1BFTkRfTU9OSVRPUklORyxcbiAgQ0hFQ0tfQUhfVE9LRU4sXG59IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgc2V0TW9uaXRvcmluZ1N0YXR1cyxcbn0gZnJvbSAnLi4vcHVic3ViL3Bvc3QtbWVzc2FnZXMnO1xuXG5sZXQgb3JpZ2luYWxEYXRhOiBvYmplY3QgPSB7fTtcbmxldCBtb3VzZUV2ZW50OiBudW1iZXI7XG5sZXQga2V5Ym9hcmRFdmVudDogbnVtYmVyO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgpID0+IHtcbiAga2V5Ym9hcmRFdmVudCA9IERhdGUubm93KCk7XG59KTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcbiAgbW91c2VFdmVudCA9IERhdGUubm93KCk7XG59KTtcblxuLyoqXG4gKiBIYW5kbGUgbW9uaXRvcmluZyByZXNwb25zZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhhbmRsZU1vbml0b3JpbmdSZXNwb25zZSgpIHtcbiAgbGV0IGhlYXJ0YmVhdHNTZW50ID0gMDtcbiAgc2V0TW9uaXRvcmluZ1N0YXR1cyh0cnVlKTtcbiAgY29uc3QgaGVhcnRiZWF0VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICBpZiAoaGVhcnRiZWF0c1NlbnQgPCAyMCkge1xuICAgICAgICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goQ0hFQ0tfQUhfVE9LRU4pO1xuICAgICAgICBoZWFydGJlYXRzU2VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYXJIZWFydGJlYXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIDMwMDAwKTtcblxuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goQ0hFQ0tfQUhfVE9LRU4pO1xuXG4gIGZ1bmN0aW9uIGNsZWFySGVhcnRiZWF0KCkge1xuICAgIHNldE1vbml0b3JpbmdTdGF0dXMoZmFsc2UpO1xuICAgIGNsZWFySW50ZXJ2YWwoaGVhcnRiZWF0VGltZXIpO1xuICAgIFRlYWxpdW1QdWJTdWIudW5zdWJzY3JpYmUoR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcpO1xuICB9XG5cbiAgVGVhbGl1bVB1YlN1Yi5zdWJzY3JpYmUoR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcsIGNsZWFySGVhcnRiZWF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyYWJIZWFydGJlYXREYXRhKCkge1xuICBvcmlnaW5hbERhdGEgPSBncmFiRGF0YShvcmlnaW5hbERhdGEsIGtleWJvYXJkRXZlbnQsIG1vdXNlRXZlbnQpO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLy8gdGhpcyB1dGlsaXR5IG1ldGhvZCBhbGxvd3MgdXMgdG8gcHJvcGVybHkgaGFuZGxlIGFsbCBuZXR3b3JrIHJlcXVlc3QgZXJyb3JzXG4vLyB0aGlzIGFsc28gYWxsb3dzIHVzIHRvIHJldHJ5IG5ldHdvcmsgY2FsbHMsIG9taXQgdGhlIHJldHJ5IHBhcmFtZXRlciB3aWxsIGVmZmVjdGl2ZWx5IHR1cm4gb2ZmIHJldHJpZXNcblxuLy8gZXhhbXBsZSB1c2FnZTpcbi8vIGltcG9ydCBmZXRjaFdpdGhSZXRyeSBmcm9tICcuLi91dGlsaXRpZXMvZmV0Y2gtd2l0aC1yZXRyeSdcbi8vIGltcG9ydCB7IE1BWF9FUlJfUkVUUklFUyB9IGZyb20gJy4vd2lkZ2V0LWNvbnN0YW50cyc7XG4vLyBmZXRjaFdpdGhSZXRyeSgnaHR0cDovL2xvY2FsaG9zdDo0MDAwL21vY2tfcmVmSUQnLCB7XG4vLyAgICAgbWV0aG9kOiAnUE9TVCcsXG4vLyAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4vLyAgICAgaGVhZGVyczogeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9XG4vLyB9LCBNQVhfRVJSX1JFVFJJRVMpXG4vLyAudGhlbigocmVzcG9uc2UpID0+IGNvbnNvbGUubG9nKCdTVUNDQ0VTUyB3aXRoIHJldHJ5JywgcmVzcG9uc2UpKVxuLy8gLmNhdGNoKChyZXNwb25zZSkgPT4gY29uc29sZS5sb2coJ0VSUk9SIHdpdGggcmV0cnknLCByZXNwb25zZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdpdGhSZXRyeSh1cmw6IHN0cmluZywgb3B0aW9uczogb2JqZWN0LCByZXRyaWVzOiBudW1iZXIgPSAwKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZVJldHJ5ID0gTWF0aC5hYnMocmV0cmllcyk7XG4gICAgICAgIGlmIChzYW5pdGl6ZVJldHJ5ID4gMCkgcmV0dXJuIGZldGNoV2l0aFJldHJ5KHVybCwgb3B0aW9ucywgc2FuaXRpemVSZXRyeSAtIDEpXG4gICAgICAgIHRocm93IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG59IiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgdXRpbGl0aWVzL2dldC1jb29raWUgKi9cbmltcG9ydCB7IENPT0tJRSB9IGZyb20gJy4uL3dpZGdldC1jb25zdGFudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb29raWVTdG9yYWdlKG5hbWU6IG9iamVjdCB8IHN0cmluZyA9IENPT0tJRS5OQU1FKTogYW55IHtcbiAgY29uc3QgbG9va3VwID0gYCR7bmFtZX09YDtcbiAgY29uc3QgZGVjb2RlZENvb2tpZSA9IGRlY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5jb29raWUpO1xuICBjb25zdCBjb29raWVBcnIgPSBkZWNvZGVkQ29va2llLnNwbGl0KCc7Jyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29va2llQXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbGV0IGNvb2tpZSA9IGNvb2tpZUFycltpXTtcbiAgICB3aGlsZSAoY29va2llLmNoYXJBdCgwKSA9PT0gJyAnKSB7XG4gICAgICBjb29raWUgPSBjb29raWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBpZiAoY29va2llLmluZGV4T2YobG9va3VwKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29va2llLnN1YnN0cmluZyhsb29rdXAubGVuZ3RoLCBjb29raWUubGVuZ3RoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7fTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHV0aWxpdGllcy9zZXQtY29va2llICovXG5pbXBvcnQgeyBDT09LSUUgfSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcbmltcG9ydCBnZXRDb29raWVTdG9yYWdlIGZyb20gJy4vZ2V0LWNvb2tpZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNldENvb2tpZVN0b3JhZ2UocGF5bG9hZDogb2JqZWN0LCBjb29raWU6IHsgTkFNRTogc3RyaW5nLCBFWFBJUkFUSU9OOiBudW1iZXIsIERPTUFJTjogc3RyaW5nLCBTRUNVUkU6IGJvb2xlYW4sIFBBVEg6IHN0cmluZyB9ID0gQ09PS0lFKSB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShPYmplY3QuYXNzaWduKGdldENvb2tpZVN0b3JhZ2UoY29va2llLk5BTUUpLCBwYXlsb2FkKSk7XG4gIGNvbnN0IGlzTG9jYWwgPSB3aW5kb3cuc3BhcnRhLmVudiA9PT0gJ2xvY2FsJztcbiAgY29uc3QgZXhwaXJ5ID0gYDsgZXhwaXJlcz0keyhuZXcgRGF0ZShEYXRlLm5vdygpICsgKGNvb2tpZS5FWFBJUkFUSU9OICogMjQgKiA2MCAqIDYwICogMTAwMCkpKS50b1VUQ1N0cmluZygpfWA7XG4gIGNvbnN0IGRvbWFpbiA9IGlzTG9jYWwgPyAnJyA6IGA7IGRvbWFpbj0ke2Nvb2tpZS5ET01BSU59YDtcbiAgY29uc3Qgc2VjdXJlID0gKGNvb2tpZS5TRUNVUkUgJiYgIWlzTG9jYWwpID8gJzsgc2VjdXJlJyA6ICcnO1xuICBjb25zdCBjb29raWVJbmZvID0gYCR7Y29va2llLk5BTUV9PSR7c3RyaW5naWZpZWRWYWx1ZX0ke2V4cGlyeX07IHBhdGg9JHtjb29raWUuUEFUSH0ke2RvbWFpbn0ke3NlY3VyZX1gO1xuXG4gIHdpbmRvdy5kb2N1bWVudC5jb29raWUgPSBjb29raWVJbmZvO1xufVxuIiwiLyoqIEBtb2R1bGUgdXRpbGl0aWVzL3V0aWxpdGllcyAqL1xuXG5pbXBvcnQge1xuICBCT0ZBLFxuICBCT0ZBX0RPTUFJTlMsXG4gIEJPRkFfU0FMRV9JTkRJQ0FUT1JTLFxuICBDQU5DRUxfU0lURV9TVUJTLFxuICBJTlRFUk5BTCxcbiAgSU5RX0NMSUVOVF9PUkRFUl9OVU0sXG4gIElSX0VOVixcbiAgTUFYX0VSUl9SRVRSSUVTLFxuICBNRVJSSUxMLFxuICBNTF9TQUxFX0lORElDQVRPUlMsXG4gIFNQQVJUQSxcbiAgQ09PS0lFX0dTSUQsXG59IGZyb20gXCIuLi93aWRnZXQtY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZW5kUHJveHlQb3N0TWVzc2FnZSB9IGZyb20gXCIuLi9wdWJzdWIvcG9zdC1tZXNzYWdlc1wiO1xuaW1wb3J0IGdldENvb2tpZVN0b3JhZ2UgZnJvbSBcIi4vZ2V0LWNvb2tpZVwiO1xuaW1wb3J0IHNldENvb2tpZVN0b3JhZ2UgZnJvbSBcIi4vc2V0LWNvb2tpZVwiO1xuLyoqXG4gKiBpc0ludGVybmFsXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIGludGVybmFsIHNpdGVzIHRvIGRlZmF1bHQgdGhlbSB0byBzb3VyY2UgVVJMIGZvciB3aWRnZXRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlcm5hbCgpIHtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKFwiLy9naHJzaWViZWxcIikgPiAtMSB8fFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoXCIvL2Fjb25saW5lXCIpID4gLTEgfHxcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKFwiLy9hc2toclwiKSA+IC0xXG4gICk7XG59XG5cbi8qKlxuICogaXNNZXJyaWxsXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIC5tbCBvciAubWVycmlsbGVkZ2UgYW5kIGlmIHNvIHRoZW4gaXQgaXMgYSBNZXJyaWxsIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXJyaWxsKCkge1xuICByZXR1cm4gKFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCIubWxcIikgPiAtMSB8fFxuICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCIubWVycmlsbGVkZ2VcIikgPiAtMVxuICApO1xufVxuXG4vKipcbiAqIGlzU3BhcnRhXG4gKiBXZSB3aWxsIGNoZWNrIHRoZSB1cmwgZm9yIHNwYXJ0YS4gYW5kIGlmIHNvIHRoZW4gaXQgaXMgb24gYSBTcGFydGEgc2l0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NwYXJ0YSgpIHtcbiAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ob3N0LmluZGV4T2YoXCJzcGFydGEuXCIpID4gLTE7XG59XG5cbi8qKlxuICogaXNTZWN1cmVRQVxuICogUUE1IGFuZCBRQVBTIGFyZSB1bmFibGUgdG8gbG9hZCBkZXYvY2VydCBkb21haW5zLiBUaGlzIGFscmVhZHkgaGFwcGVucyBuYXR1cmFsIGZvciB3d3csXG4gKiBidXQgc2VjdXJlIHdpbGwgbmVlZCB0byBiZSByb3V0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZWN1cmVRQSgpIHtcbiAgcmV0dXJuIChcbiAgICB3aW5kb3cubG9jYXRpb24uaG9zdC5pbmRleE9mKFwiLXFhNVwiKSA+IC0xIHx8XG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZihcIi1xYXBzXCIpID4gLTFcbiAgKTtcbn1cblxuLyoqXG4gKiB3aGljaERvbWFpblxuICogVGhpcyB3aWxsIGJlIHV0aWxpemUgdG8gZGV0ZXJtaW5lIHdoaWNoIHdpZGdldFNjcmlwdCB0byBsb2FkOyB3aGljaCBkb21haW4gdG8gcG9pbnRcbiAqIHdoZW4gcmVmZXJlbmNpbmcgdGhlIHdpZGdldCwgYW5kIHRvIGRldGVybWluZSB3aGljaCBwcmVjb25uZWN0L3BvbGxpbmcgYXR0cmlidXRlcyB0byBwdWxsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hpY2hEb21haW4oKSB7XG4gIGlmIChpc01lcnJpbGwoKSkge1xuICAgIHJldHVybiBNRVJSSUxMO1xuICB9XG4gIGlmIChpc0ludGVybmFsKCkpIHtcbiAgICByZXR1cm4gSU5URVJOQUw7XG4gIH1cbiAgaWYgKGlzU3BhcnRhKCkpIHtcbiAgICByZXR1cm4gU1BBUlRBO1xuICB9XG4gIHJldHVybiBCT0ZBO1xufVxuXG4vKipcbiAqIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBsYW5ndWFnZSB2ZXJzaW9ucyBvZiBjaGF0LiBBIFNwYW5pc2ggdmVyc2lvbiBhbmQgYW4gRW5nbGlzaCB2ZXJzaW9uLiBXZVxuICogd2lsbCBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gdGhhdCByZWxhdGVzIHRvIGxhbmd1YWdlIHZhbHVlIG9mIHRoZSBwYWdlLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbmlzaCgpIHtcbiAgY29uc3Qgc3BhbmlzaElkZW50aWZpZXJzID0gW1wiZXMtdXNcIiwgXCJlc1wiLCBcInNwYW5pc2hcIiwgXCJlc3Bhbm9sXCJdO1xuICBjb25zdCBsYW5ndWFnZSA9XG4gICAgd2luZG93LmdlbmVzeXNEYXRhICYmIHdpbmRvdy5nZW5lc3lzRGF0YS5MQU5HVUFHRVxuICAgICAgPyB3aW5kb3cuZ2VuZXN5c0RhdGEuTEFOR1VBR0VcbiAgICAgIDogXCJlblwiO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIGxldCBpc1NwYW5pc2ggPSBmYWxzZTtcbiAgaWYgKFxuICAgIHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHNwYW5pc2hJZGVudGlmaWVycy5pbmRleE9mKGxhbmd1YWdlLnRvTG93ZXJDYXNlKCkpID4gLTFcbiAgKSB7XG4gICAgaXNTcGFuaXNoID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNTcGFuaXNoID8gXCJlc1wiIDogXCJlblwiO1xufVxuXG4vKipcbiAqIHF1ZXJ5U3RyaW5nUGFyc2VcbiAqIFVzZWQgdG8gcGFyc2Ugb3V0IHF1ZXJ5IHN0cmluZyB2YWx1ZXMgdG8gcHJvdmlkZSBhIG1vZGlmaWVkIGNoYXQgZXhwZXJpZW5jZSBpbiBMTEVzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIG5hbWUgZm9yIHF1ZXJ5IHN0cmluZyB0byBwYXJzZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nUGFyc2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFs/Jl0ke25hbWV9KD0oW14mI10qKXwmfCN8JClgKTtcbiAgY29uc3QgcmVzdWx0cyA9IHJlZ2V4LmV4ZWModXJsKTtcbiAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0c1syXSkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdKTtcbiAgcmV0dXJuIFwiXCI7XG59XG5cblxuXG4vKipcbiAqIHdoaWNoVmVyc2lvblxuICogV2Ugd2lsbCBub3cgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB3d3ctY2hhdC9zZWN1cmUtY2hhdC5cbiAqIFNvIHdlIHdpbGwgY2hlY2sgZm9yIHdoaWNoIHZlcnNpb24gdG8gdXNlIHdoaWNoIHdpbGwgYmUgc2VudCBhcyBhIHBhcmFtZXRlclxuICogYXR0YWNoZWQgdG8gYSBxdWVyeSBzdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaFZlcnNpb24oKSB7XG4gIGNvbnN0IHY2ID0gaXNWNigpO1xuICBpZiAoIXY2KSB7XG4gICAgaWYgKHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJub3Rwcm9kXCIpIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBxdWVyeVN0cmluZ1BhcnNlKFwid2lkZ2V0VmVyc2lvblwiKTtcbiAgICAgIGlmICh2ZXJzaW9uICE9PSBcIlwiKSByZXR1cm4gdmVyc2lvbjtcbiAgICAgIHJldHVybiBcIjMuMC4wXCI7XG4gICAgfVxuICAgIHJldHVybiBcIjMuMC4wXCI7XG4gIH1cbiAgcmV0dXJuIFwiMS4wLjBcIjtcbn1cblxuXG4vKipcbiAqIGdldCBWNiB3aWRnZXQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFY2V2lkZ2V0Q29uZmlnKCkge1xuICBjb25zdCBndENoYXRXaWRnZXQgPSB7XG4gICAgbmFtZTogXCJndC1jaGF0LXdpZGdldFwiLFxuICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICBwYXRoOiBnZXREb21haW4oKSxcbiAgICBzcGlubmVyOiBmYWxzZSxcbiAgICBsb2FkZXJWZXJzaW9uOiBcIjYuMC41XCIsXG4gICAgY29udGFpbmVyOiBcIiNjaGF0LXBsYWNlaG9sZGVyXCIsXG4gICAgb3B0aW9uczoge1xuICAgICAgZGF0YTogeyB2NjogdHJ1ZSB9LFxuICAgICAgd2l0aG91dENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGd0Q2hhdFdpZGdldDtcbn1cblxuLyoqXG4gKiBJZGVudGlmeSBpZiB2ZXJzaW9uIGlzIFY2XG4gKiBcbiAqIENvbGxhYm9yYXRvcnMgY29kZSBmb3IgVjUgb3IgVjYgaWRlbnRpZmljYXRpb25cbiAqIFxuICogXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Y2KCkge1xuICBsZXQgaXNWNiA9IGZhbHNlO1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7IC8vIFBhcnNlIHF1ZXJ5IHN0cmluZ1xuICBjb25zdCBxdWVyeUVuYWJsZWQgPSBxdWVyeVBhcmFtcy5nZXQoXCJ2NlwiKSA9PT0gXCJ0cnVlXCI7IC8vIENoZWNrIGlmIHY2IGV4aXN0cyBhbmQgaXMgXCJ0cnVlXCJcbiAgY29uc3QgZGRvRW5hYmxlZCA9IEFycmF5LmlzQXJyYXkod2luZG93Py5kaWdpdGFsRGF0YT8ucGFnZT8ucGFnZUluZm8pXG4gICAgPyB3aW5kb3cuZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mb1swXT8uYXR0cmlidXRlcz8uY2hhdD8udjZcbiAgICA6ICh3aW5kb3c/LmRpZ2l0YWxEYXRhPy5wYWdlPy5wYWdlSW5mbyBhcyB7IGF0dHJpYnV0ZXM/OiB7IGNoYXQ/OiB7IHY2PzogYm9vbGVhbiB9IH0gfSk/LmF0dHJpYnV0ZXM/LmNoYXQ/LnY2O1xuICBpZiAocXVlcnlFbmFibGVkIHx8IGRkb0VuYWJsZWQpIGlzVjYgPSB0cnVlO1xuICByZXR1cm4gaXNWNjtcbn1cblxuLyoqXG4gKiBnZXREb21haW5cbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGF1dG9tYXRlIHRoZSBVUkwgcHJvY2VzcyByZWdhcmRsZXNzIG9mIHNpdGUgb3IgbG9jYXRpb24gb2YgY2hhdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW4oKSB7XG4gIGNvbnN0IGlzUHJvZCA9IHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJwcm9kXCI7XG5cbiAgaWYgKCFpc1Byb2QpIHtcbiAgICBjb25zdCBlbnYgPSBxdWVyeVN0cmluZ1BhcnNlKFwiY2hhdEVudlwiKTtcbiAgICBpZiAoZW52ICE9PSBcIlwiKSByZXR1cm4gYGh0dHBzOi8vd3d3LSR7ZW52fS5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3QuaW5kZXhPZihcImxvY2FsaG9zdFwiKSA+IC0xKVxuICAgICAgcmV0dXJuIFwiaHR0cDovL2xvY2FsaG9zdDozMDA1XCI7XG4gIH1cblxuICBzd2l0Y2ggKHdoaWNoRG9tYWluKCkpIHtcbiAgICBjYXNlIEJPRkE6XG4gICAgICBpZiAoaXNQcm9kKSB7XG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhvc3ROYW1lID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoaG9zdE5hbWUuaW5kZXhPZihcInNpdDFcIikgPiAtMSB8fCBob3N0TmFtZS5pbmRleE9mKFwicHJldmlldzFcIikgPiAtMSkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy1zaXQxYS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG4gICAgICBpZiAoaG9zdE5hbWUuaW5kZXhPZihcInNpdDJcIikgPiAtMSB8fCBob3N0TmFtZS5pbmRleE9mKFwicHJldmlldzJcIikgPiAtMSkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy1zaXQyYS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tXCI7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQk9GQV9ET01BSU5TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZihCT0ZBX0RPTUFJTlNbaV0pID4gLTEpIHtcbiAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LSR7Qk9GQV9ET01BSU5TW2ldfWVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYGh0dHBzOi8vd3d3LSR7SVJfRU5WLkNFUlR9LWhlbGl4LmVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuXG4gICAgY2FzZSBNRVJSSUxMOlxuICAgICAgaWYgKGlzUHJvZCkge1xuICAgICAgICBjb25zdCBtbERvbWFpbiA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2NoYXR1aS4ke21sRG9tYWlufWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGhvc3RuYW1lOiBobiB9ID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICBjb25zdCB7IENFUlQsIERFViB9ID0gSVJfRU5WO1xuXG4gICAgICAgIGNvbnN0IGRldGVybWluZUNlcnQgPVxuICAgICAgICAgIGhuLmluY2x1ZGVzKFwicGwxXCIpIHx8XG4gICAgICAgICAgaG4uaW5jbHVkZXMoXCJwbDJcIikgfHxcbiAgICAgICAgICBobi5pbmNsdWRlcyhcInNpdDFcIikgfHxcbiAgICAgICAgICBobi5pbmNsdWRlcyhcInNpdDJcIik7XG5cbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwibWVycmlsbGVkZ2VzaXQxXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLm1lcnJpbGxlZGdlc2l0MS5jb21cIjtcbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwibWVycmlsbGVkZ2VzaXQyXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLm1lcnJpbGxlZGdlc2l0Mi5jb21cIjtcbiAgICAgICAgaWYgKGhuLmluY2x1ZGVzKFwiZnNzaXQxLm1sLmNvbVwiKSkgcmV0dXJuIFwiaHR0cHM6Ly9jaGF0dWkuZnNzaXQxLm1sLmNvbVwiO1xuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJmc3NpdDIubWwuY29tXCIpKSByZXR1cm4gXCJodHRwczovL2NoYXR1aS5mc3NpdDIubWwuY29tXCI7XG4gICAgICAgIGlmIChobi5pbmNsdWRlcyhcImJlbmVmaXRzc2l0Mi5tbC5jb21cIikpXG4gICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9jaGF0dWkuYmVuZWZpdHNzaXQyLm1sLmNvbVwiO1xuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJiZW5lZml0c3NpdDEubWwuY29tXCIpKVxuICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vY2hhdHVpLmJlbmVmaXRzc2l0MS5tbC5jb21cIjtcblxuICAgICAgICBpZiAoaG4uaW5jbHVkZXMoXCJzZWN1cmUtZGV2My5vbGRpZlwiKSlcbiAgICAgICAgICByZXR1cm4gXCJodHRwczovL2NoYXR1aS1kZXYzLm1sLmNvbVwiO1xuXG4gICAgICAgIGlmIChkZXRlcm1pbmVDZXJ0KSByZXR1cm4gYGh0dHBzOi8vY2hhdHVpLSR7Q0VSVH0ubWwuY29tYDtcbiAgICAgICAgcmV0dXJuIGBodHRwczovL2NoYXR1aS0ke0RFVn0ubWwuY29tYDtcbiAgICAgIH1cbiAgICBjYXNlIElOVEVSTkFMOlxuICAgICAgaWYgKGlzUHJvZCkge1xuICAgICAgICByZXR1cm4gXCJodHRwczovL3d3dy5iYW5rb2ZhbWVyaWNhLmNvbVwiO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICBjb25zdCBpbnRFbnYgPVxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5jbHVkZXMoXCItdWF0XCIpIHx8XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKFwicWEuXCIpXG4gICAgICAgICAgPyBJUl9FTlYuQ0VSVFxuICAgICAgICAgIDogSVJfRU5WLkRFVjtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly93d3ctJHtpbnRFbnZ9LWhlbGl4LmVjbnAuYmFua29mYW1lcmljYS5jb21gO1xuXG4gICAgY2FzZSBTUEFSVEE6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgIGNvbnN0IHNwYXJ0YUVudiA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJlbnZpcm9ubWVudFwiKTtcbiAgICAgIGlmIChzcGFydGFFbnYgIT09IFwiXCIgJiYgc3BhcnRhRW52LnN0YXJ0c1dpdGgoXCJodHRwc1wiKSkgcmV0dXJuIHNwYXJ0YUVudjtcbiAgICAgIHJldHVybiBgaHR0cHM6Ly93d3ctJHtJUl9FTlYuREVWfS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGBodHRwczovL3d3dy0ke0lSX0VOVi5DRVJUfS1oZWxpeC5lY25wLmJhbmtvZmFtZXJpY2EuY29tYDtcbiAgfVxufVxuXG4vKipcbiAqIGlzRW1wdHlPYmpcbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBlbXB0eSAocmV0dXJucyB0cnVlKSBvciBjb250YWluc1xuICoga2V5L3ZhbHVlIHBhaXJzIChyZXR1cm5zIGZhbHNlKVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqKG9iajogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogaXNFbXB0eUFyclxuICogRnVuY3Rpb24gZGVzaWduZWQgdG8gY2hlY2sgaWYgYW4gYXJyYXkgaXMgZW1wdHkgKHJldHVybnMgdHJ1ZSkgb3IgY29udGFpbnMgaXRlbXMgKHJldHVybnMgZmFsc2UpXG4gKiBAcGFyYW0ge2FycmF5fSBhcnJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycihhcnI6IGFueVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiAhKEFycmF5LmlzQXJyYXkoYXJyKSAmJiBhcnIubGVuZ3RoID09PSAwKTtcbn1cblxuLyoqXG4gKiBpc1NhbGVQcmVzZW50XG4gKiBGdW5jdGlvbiBkZXNpZ25lZCB0byBjaGVjayB0aHJvdWdoIHRoZSBkaWdpdGFsRGF0YSBvYmplY3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbGwgdGhlXG4gKiBwb3NzaWJsZSBzYWxlIGluZGljYXRvcnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGRvIC0gdGhlIGRpZ2l0YWxEYXRhIG9iamVjdCBvbiB0aGUgd2luZG93XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGlmIGRlZmluZWRcbiAqIEByZXR1cm5zIHtudWxsfSAtIGlmIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYWxlUHJlc2VudChkZG86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgc2FsZUluZGljYXRvcnMgPVxuICAgIHdoaWNoRG9tYWluKCkgPT09IEJPRkEgPyBCT0ZBX1NBTEVfSU5ESUNBVE9SUyA6IE1MX1NBTEVfSU5ESUNBVE9SUztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYWxlSW5kaWNhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gJiZcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gIT09IG51bGwgJiZcbiAgICAgIGRkb1tzYWxlSW5kaWNhdG9yc1tpXV0gIT09IFwiXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBkZG9bc2FsZUluZGljYXRvcnNbaV1dO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBwcm94eUNoYXRERE9cbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIHNldCBtdXRhdGlvbiBvYnNlcnZlciBvbiBERE9cbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBkZG8gb2JqZWN0IHRvIGJlIG9ic2VydmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSB2YWx1ZSB0aGF0IGlzIGxpc3RlbmVkIGZvclxuICogQHJldHVybiB7Ym9vbH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5Q2hhdERETyhvYmo6IG9iamVjdCwga2V5OiBzdHJpbmcpIHtcbiAgbGV0IG9sZFZhbHVlID0gb2JqW2tleV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBvbGRWYWx1ZTtcbiAgICB9LFxuICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgbG9nR2VuZXN5c0V2ZW50KDIsIFwiQmFjdG0gUHJveHkgRERPIENoYW5nZVwiLCBgbmV3VmFsdWU6ICR7bmV3VmFsdWV9YCk7XG5cbiAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgIGlmIChrZXkgPT09IFwiYXBwbGljYXRpb25JRFwiKSBrZXkgPSBJTlFfQ0xJRU5UX09SREVSX05VTTtcbiAgICAgIHNlbmRQcm94eVBvc3RNZXNzYWdlKGtleSwgbmV3VmFsdWUpO1xuICAgIH0sXG4gIH0pO1xufVxuLyoqXG4gKiBpbmNyZWFzZUVycm9yQ291bnRcbiAqIEZ1bmN0aW9uIGRlc2lnbmVkIHRvIGNvdW50IGV2ZXJ5IHRpbWUgdGhhdCBhbiBlcnJvciBvY2N1cnMuIE9uY2UgMyBlcnJvcnMgb2NjdXIsXG4gKiBwdWJsaXNoIHdpbGwgb2NjdXIgdG8gc2h1dGRvd24gY2hhdCBvbiB3aWRnZXQgYW5kIHNpdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlRXJyb3JDb3VudCgpIHtcbiAgaWYgKGJhY3RtICYmIGJhY3RtLmRkbykge1xuICAgIGxldCBlcnJvckNvdW50ID1cbiAgICAgIGJhY3RtLmRkby5nZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5nZW5lc3lzX2Vycm9yX2NvdW50XCIpIHx8IDA7XG4gICAgZXJyb3JDb3VudCsrO1xuICAgIGJhY3RtLmRkby5zZXQoXCJwYWdlLmF0dHJpYnV0ZXMuY2hhdC5nZW5lc3lzX2Vycm9yX2NvdW50XCIsIGVycm9yQ291bnQpO1xuICAgIGlmIChlcnJvckNvdW50ID09PSBNQVhfRVJSX1JFVFJJRVMpIFRlYWxpdW1QdWJTdWIucHVibGlzaChDQU5DRUxfU0lURV9TVUJTKTtcbiAgfVxufVxuXG4vKipcbiAqIGdldEhvc3ROYW1lXG4gKiBFeHRyYWN0cyBob3N0bmFtZSBmcm9tIFVSTCBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgdG8gZXh0cmFjdCBob3N0bmFtZVxuICogQHJldHVybnMge3N0cmluZ30gaG9zdG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhvc3ROYW1lKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKC86XFwvXFwvKHd3d1swLTldP1xcLik/KC5bXi86XSspL2kpO1xuXG4gIGlmIChcbiAgICBtYXRjaCAhPSBudWxsICYmXG4gICAgbWF0Y2gubGVuZ3RoID4gMiAmJlxuICAgIHR5cGVvZiBtYXRjaFsyXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG1hdGNoWzJdLmxlbmd0aCA+IDBcbiAgKSB7XG4gICAgcmV0dXJuIG1hdGNoWzJdO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogZ2V0VG9wTGV2ZWxEb21haW5cbiAqIEV4dHJhY3QgVExEIGZyb20gVVJMIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHVybCB0byBleHRyYWN0IHRsZFxuICogQHJldHVybnMge3N0cmluZ30gdG9wIGxldmVsIGRvbWFpblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9wTGV2ZWxEb21haW4odXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgbWVycmlsbFRMRHMgPSBbXG4gICAgLy8gZ29lcyBmcm9tIG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3Qgc3BlY2lmaWNcbiAgICBcIm1lcnJpbGxlZGdlc2l0MS5jb21cIixcbiAgICBcIm1lcnJpbGxlZGdlc2l0Mi5jb21cIixcbiAgICBcImZzc2l0MS5tbC5jb21cIixcbiAgICBcImZzc2l0Mi5tbC5jb21cIixcbiAgICBcImJlbmVmaXRzc2l0MS5tbC5jb21cIixcbiAgICBcImJlbmVmaXRzc2l0Mi5tbC5jb21cIixcbiAgICBcIm1sLmNvbVwiLFxuICAgIFwibWVycmlsbGVkZ2UuY29tXCIsXG4gIF07XG5cbiAgaWYgKHVybC5pbmNsdWRlcyhcImJhbmtvZmFtZXJpY2EuY29tXCIpIHx8IHVybC5pbmNsdWRlcyhcImxvY2FsaG9zdFwiKSlcbiAgICByZXR1cm4gXCJiYW5rb2ZhbWVyaWNhLmNvbVwiO1xuXG4gIHJldHVybiBtZXJyaWxsVExEcy5maWx0ZXIoKHRsZCkgPT4gdXJsLmluY2x1ZGVzKHRsZCkpWzBdO1xufVxuXG4vKipcbiAqIGdldEN1cnJlbnREb21haW5cbiAqIE9idGFpbnMgdGhlIGN1cnJlbnQgVExEIGRvbWFpbiBmcm9tIGN1cnJlbnQgd2luZG93LmxvY2F0aW9uLmhyZWZcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEN1cnJlbnQgVExEXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RG9tYWluKCkge1xuICBpZiAod2luZG93LmxvY2F0aW9uLm9yaWdpbiA9PT0gXCJodHRwOi8vbG9jYWxob3N0OjQwMDBcIikge1xuICAgIHJldHVybiBcImxvY2FsaG9zdFwiO1xuICB9XG4gIHJldHVybiBnZXRUb3BMZXZlbERvbWFpbih3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoIHRvIHdpbmRvd1xuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb24gZXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkIC0gRXZlbnRzIHBheWxvYWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFdpbmRvdyhldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IG9iamVjdCk6IGJvb2xlYW4ge1xuICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyLnB1YihldmVudE5hbWUsIHBheWxvYWQpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUHVibGlzaCB0byBUZWFsaXVtXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gbmFtZSBvbiBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IHBheWxvYWQgLSBFdmVudHMgcGF5bG9hZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoVGVhbGl1bShldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IG9iamVjdCk6IGJvb2xlYW4ge1xuICBUZWFsaXVtUHViU3ViLnB1Ymxpc2goZXZlbnROYW1lLCBwYXlsb2FkKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZSBDaGF0IEVudmlyb25tZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluZUNoYXRFbnYoKSB7XG4gIGlmICh3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IpIHJldHVybjtcbiAgaWYgKHdpbmRvdy5udWNsZXVzKSB7XG4gICAgd2luZG93LmJhY3RtX2VudlNlbGVjdG9yID0gd2luZG93Lm51Y2xldXMuc3RhdGUoKS50b0pTKCkuY21zXG4gICAgICAuZW52aXJvbm1lbnRWYXJpYWJsZXMuaXNQcm9kXG4gICAgICA/IFwicHJvZFwiXG4gICAgICA6IFwibm90cHJvZFwiO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9IFwibm90cHJvZFwiO1xuICB9XG59XG5cbi8qKlxuICogTG9nIEdlbmVzeXMgRXZlbnRcbiAqIEBwYXJhbSB7ZXZlbnROYW1lfSAtIE5hbWUgb2YgdGhlIGdlbmVzeXMgZXZlbnRcbiAqIEBwYXJhbSB7aW5mb30gLSAgT3RoZXIgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBjb2xsZWN0ZWRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nR2VuZXN5c0V2ZW50KFxuICBsZXZlbE51bTogbnVtYmVyLFxuICBldmVudE5hbWU6IHN0cmluZyxcbiAgZGF0YTogb2JqZWN0IHwgc3RyaW5nIHwgdW5rbm93blxuKSB7XG4gIGlmICh3aW5kb3cuYmFjdG1fZW52U2VsZWN0b3IgPT09IFwicHJvZFwiKSByZXR1cm47XG4gIGlmICghd2luZG93LmJhY3RtKSB7XG4gICAgd2luZG93LmJhY3RtID0ge307XG4gICAgd2luZG93LmJhY3RtLmNoYXRfZGF0YUNvbGxlY3RvciA9IFtdO1xuICB9XG5cbiAgY29uc3QgbGV2ZWxOdW1FdmVudHMgPSB7XG4gICAgMTogXCJpbmZvXCIsXG4gICAgMjogXCJ3YXJuXCIsXG4gICAgMzogXCJlcnJvclwiLFxuICB9O1xuXG4gIGNvbnN0IGxldmVsID0gbGV2ZWxOdW1FdmVudHNbbGV2ZWxOdW1dO1xuXG4gIGNvbnN0IG5ld0V2ZW50ID0ge1xuICAgIGV2ZW50TmFtZSxcbiAgICBkYXRhLFxuICB9O1xuXG4gIGNvbnN0IGRlYnVnQ2hhdCA9IHF1ZXJ5U3RyaW5nUGFyc2UoXCJkZWJ1Z0NoYXRcIik7XG4gIGlmIChkZWJ1Z0NoYXQgPT09IFwiMVwiKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGBCYWN0bSBHZW5lc3lzIENoYXQgLSAke2V2ZW50TmFtZX1gKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuaW5mbyh7IGRhdGEsIGxldmVsIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5ncm91cEVuZCgpO1xuICB9XG5cbiAgd2luZG93LmJhY3RtLmNoYXRfZGF0YUNvbGxlY3Rvci5wdXNoKHsgbGV2ZWwsIG5ld0V2ZW50IH0pO1xufVxuXG4vLyAvKipcbi8vICAqIGNoZWNrSWZOYXRpdmVcbi8vICAqIENoZWNrcyBxdWVyeXN0cmluZyBmb3IgbmF0aXZlQ2hhdCBmbGFnXG4vLyAgKiBAcmV0dXJucyB7c3RyaW5nfVxuLy8gICovXG4vLyBleHBvcnQgY29uc3QgY2hlY2tJZk5hdGl2ZUNoYXQgPSAocGFyZW50V2luZG93ID0gd2luZG93LnBhcmVudCkgPT4ge1xuLy8gICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmVudFdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuLy8gICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpXG4vLyAgIGNvbnN0IGNoZWNrQ29va2llID0gYmFjdG1Db29raWVzLmdldCgnb2NjdENoYXQnKTtcbi8vICAgY29uc3Qgb2NjdENoYXRDb29raWUgPSBjaGVja0Nvb2tpZSA/IEpTT04ucGFyc2UoY2hlY2tDb29raWUpIDogXCJcIjtcblxuLy8gICByZXR1cm4gdXJsUGFyYW1zLmdldChcIm5hdGl2ZUNoYXRcIikgPT09IG51bGxcbi8vICAgPyAob2NjdENoYXRDb29raWUubmF0aXZlQ2hhdFxuLy8gICAgICAgPyBvY2N0Q2hhdENvb2tpZS5uYXRpdmVDaGF0XG4vLyAgICAgICAgIDogXCJcIilcbi8vICAgOiB1cmxQYXJhbXMuZ2V0KFwibmF0aXZlQ2hhdFwiKS50b0xvd2VyQ2FzZSgpXG5cbi8vIH07XG5cbi8vIC8qKlxuLy8gICogY2hlY2tDaGF0SURcbi8vICAqIENoZWNrcyBxdWVyeXN0cmluZyBmb3IgY2hhdElEIGZsYWdcbi8vICAqIEByZXR1cm5zIHtzdHJpbmd9XG4vLyAgKi9cbi8vIGV4cG9ydCBjb25zdCBjaGVja0NoYXRJRCA9IChwYXJlbnRXaW5kb3cgPSB3aW5kb3cucGFyZW50KSA9PiB7XG4vLyAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyZW50V2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4vLyAgIGNvbnN0IGJhY3RtQ29va2llcyA9IG5ldyBiYWN0bS5Db29raWVzKClcbi8vICAgY29uc3QgY2hlY2tDb29raWUgPSBiYWN0bUNvb2tpZXMuZ2V0KCdvY2N0Q2hhdCcpO1xuLy8gICBjb25zdCBvY2N0Q2hhdENvb2tpZSA9IGNoZWNrQ29va2llID8gSlNPTi5wYXJzZShjaGVja0Nvb2tpZSkgOiBcIlwiO1xuLy8gICByZXR1cm4gdXJsUGFyYW1zLmdldCgnY2hhdElEJykgPT09IG51bGxcbi8vICAgPyAob2NjdENoYXRDb29raWUuY2hhdElEXG4vLyAgICAgICA/IG9jY3RDaGF0Q29va2llLmNoYXRJRFxuLy8gICAgICAgICA6ICcnKVxuLy8gICA6IHVybFBhcmFtcy5nZXQoJ2NoYXRJRCcpO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrV3JhcCA9IChwYXJlbnRXaW5kb3cgPSB3aW5kb3cucGFyZW50KSA9PiB7XG4gIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyhcIndyYXA9TURBXCIpID8gXCJZXCIgOiBcIk5cIjtcbn07XG4vKipcbiAqIGdldEdTSURcbiAqIEByZXR1cm5zIG51bGwgfHwgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHU0lEKCkge1xuICBjb25zdCBnc2lkID0gZ2V0Q29va2llU3RvcmFnZShDT09LSUVfR1NJRCk7XG4gIGlmIChpc0VtcHR5T2JqKGdzaWQpKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcmV0dXJuIGdzaWQ7XG59XG5cbi8qKlxuICogc2V0cyByZWZpZCBjb29raWUgZm9yIHRlc3RpbmdcbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tSZWZJRCgpOiB2b2lkIHtcbiAgaWYgKHdpbmRvdy5iYWN0bV9lbnZTZWxlY3RvciA9PT0gXCJub3Rwcm9kXCIpIHtcbiAgICBjb25zdCBtb2NrUmVmSUQgPSBuZXcgYmFjdG0uUXVlcnlTdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYpPy5fY2FjaGVcbiAgICAgID8ubW9ja1JlZklEO1xuICAgIGlmIChtb2NrUmVmSUQpIHtcbiAgICAgIHNldENvb2tpZVN0b3JhZ2UoXG4gICAgICAgIHsgbW9ja1JlZklEIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBOQU1FOiBcIm1vY2tSZWZJRFwiLFxuICAgICAgICAgIEVYUElSQVRJT046IDEwLFxuICAgICAgICAgIERPTUFJTjogXCIuYmFua29mYW1lcmljYS5jb21cIixcbiAgICAgICAgICBTRUNVUkU6IHRydWUsXG4gICAgICAgICAgUEFUSDogXCIvXCIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxc0xvYlNldHRlcigpOiB2b2lkIHtcbiAgY29uc3Qgc2JJbmRpY2F0b3JzID0gW1wiY3VzdG9tZXJfbG9iPXNib2JcIiwgXCJzYmZsb3c9eVwiLCBcInN1YkNoYW5uZWw9U0JDTE9cIl07XG4gIGNvbnN0IGNvbnN1bWVySW5kaWNhdG9ycyA9IFtcImN1c3RvbWVyX2xvYj1jb1wiXTtcbiAgY29uc3QgZ3dpbVVzdHJ1c3RJbmRpY2F0b3JzID0gW107XG4gIGxldCBpc1NCUGFnZSA9IGZhbHNlO1xuICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpO1xuICBjb25zdCBzYkNvb2tpZSA9IGJhY3RtQ29va2llcy5nZXQoXCJpc1NCQ3VzdG9tZXJcIik7XG4gIGlmIChcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcyhcIi9zZWN1cmUtYXV0aHNhbGVzLWVjbG8vZWNsby1yZXN1bHRzLWF1dGgvXCIpXG4gICkge1xuICAgIGlzU0JQYWdlID0gc2JDb29raWUgPT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgY29uc3Qgc21CdXNJbmRpY2F0b3JzRm91bmQgPSBzYkluZGljYXRvcnMuZmlsdGVyKChpbmRpY2F0b3IpID0+XG4gICAgd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhpbmRpY2F0b3IpXG4gICk7XG4gIGNvbnN0IGlzU21hbGxCdXNpbmVzcyA9IHNtQnVzSW5kaWNhdG9yc0ZvdW5kLmxlbmd0aCA+IDA7XG4gIGlmIChpc1NtYWxsQnVzaW5lc3MgfHwgaXNTQlBhZ2UpIHtcbiAgICBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdC5jdXN0b21lcl9sb2IgPSBcInNib2JcIjtcbiAgfVxufVxuXG4vKipcbiAqIElzIFVuaXZlcnNhbCBIZWFkZXJcbiAqXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaXZlcnNhbEhlYWRlcigpOiBib29sZWFuIHtcbiAgY29uc3QgJHVuaXZlcnNhbEhlYWRlck1vZHVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidW5pdmVyc2FsSGVhZGVyTW9kdWxlXCIpO1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucygkdW5pdmVyc2FsSGVhZGVyTW9kdWxlKTtcbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG5cbi8qKiBAbW9kdWxlIHdpZGdldC1hcGkvYWdlbnQtaW5jZW50aXZlICovXG5pbXBvcnQge1xuICBHRU5FU1lTX1FVQUxJRklFRF9MRUFELFxuICBQSVhFTF9UQUdfVVJMLFxufSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGlzTWVycmlsbCxcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIEdlbmVzeXMgUXVhbGlmaWVkIExlYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZ2VudElEIC0gZW5jcnlwdGVkIE5CS0lEIGZvciB0aGUgYWdlbnRcbiAqIEBkZXNjIC0gR2VuZXN5cyBzZW5kcyBhbiBlbmNyeXB0ZWQgTkJLSUQgb25jZSB0aGUgY2hhdCBoYXMgbWFkZSBhIHF1YWxpZmllZCBsZWFkLlxuICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIGVuY3J5cHRlZCBJRCBhcyBhIGNvb2tpZSBzbyBpdCBjYW4gYmUgY29sbGVjdGVkIGJ5IEFCUEEgb25jZSBhIHNhbGVcbiAqIGhhcyBvY2N1cnJlZFxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuZXN5c0FnZW50UXVhbGlmaWVkTGVhZChldmVudE5hbWU6IHN0cmluZywgeyBhZ2VudElEIH06IHsgYWdlbnRJRDogc3RyaW5nfSkge1xuICBsb2dHZW5lc3lzRXZlbnQoMSwgR0VORVNZU19RVUFMSUZJRURfTEVBRCwgeyBhZ2VudElEIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGFnZW50TFRTID0gYmFjdG0uU3RvcmUoJ2NoYXQnLCB7IHR5cGU6ICdjb29raWUnIH0pO1xuICAgIGlmIChpc01lcnJpbGwoKSkge1xuICAgICAgYWdlbnRMVFMuY2xlYXIoKTtcbiAgICB9XG4gICAgLy8gdGhpcyBzZXRzIGJhY3RtX2x0cyBjb29raWUgY2VydGFpbiBzYWxlcyBmbG93IGNoZWNrIHRoZSBiYWN0bV9sdHMgY29va2llIHJhdGhlciB0aGFuIHRoZSBvY2N0Q2hhdF9sdHMgY29va2llXG4gICAgYWdlbnRMVFMuc2V0KCdzZWN1cmVBZ2VudElEJywgYWdlbnRJRCk7XG4gICAgYWdlbnRMVFMuc2F2ZSgpO1xuICAgIGRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0LmFnZW50X2lkID0gYWdlbnRMVFMuZ2V0KCdzZWN1cmVBZ2VudElEJyk7XG4gICAgZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQuc2FsZV9vY2N1cnJlZCA9IGZhbHNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nR2VuZXN5c0V2ZW50KDMsICdHZW5lc3lzIEFnZW50IFF1YWxpZmllZCBMZWFkIEVycm9yJywgZSk7XG4gICAgaWYgKGJhY3RtICYmIGJhY3RtLnBsdWdpbnMgJiYgYmFjdG0ucGx1Z2lucy5waXhlbFRhZykgYmFjdG0ucGx1Z2lucy5waXhlbFRhZy5maXJlUGl4ZWxUYWcoYCR7UElYRUxfVEFHX1VSTH0/ZXJyb3I9JHtlfWApO1xuICAgIGluY3JlYXNlRXJyb3JDb3VudCgpO1xuICB9XG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqIEBtb2R1bGUgd2lkZ2V0LWFwaS9jby1icm93c2UgKi9cbmltcG9ydCB7XG4gIEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJFRCxcbiAgUElYRUxfVEFHX1VSTCxcbn0gZnJvbSAnLi4vd2lkZ2V0LWNvbnN0YW50cyc7XG5pbXBvcnQgeyBcbiAgaW5jcmVhc2VFcnJvckNvdW50LFxuICBsb2dHZW5lc3lzRXZlbnQsXG59IGZyb20gJy4uL3V0aWxpdGllcy91dGlsaXRpZXMnO1xuXG4vKipcbiAqIENvIGJyb3dzZVxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWd1cmF0aW9uXG4gKiBUT0RPIGh0dHA6Ly9sb2NhbGhvc3Q6NDAwMC9zcGFydGEtZGVtby9jaGF0LXdpZGdldC1kZW1vL3VuZGVmaW5lZGpzL2djYi5taW4uanMgdW5kZWZpbmVkIGlzIGVudkNvYnJvd3NlVVJMXG4gKiBUT0RPIENvYnJvd3NlIGNvbmZpZ3VyYXRpb24gaW5jb3JyZWN0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChldmVudE5hbWU6IHN0cmluZywgY29uZmlndXJhdGlvbjogeyBlbnZDb2Jyb3dzZVVSTDogc3RyaW5nIH0pIHtcbiAgdHJ5IHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMSwgJ0dlbmVzeXMgQ29icm93c2UgQ29uZmlndXJhdGlvbicsIGNvbmZpZ3VyYXRpb24pO1xuICAgIChmdW5jdGlvbiAoZCwgcywgaWQsIG8pIHtcbiAgICAgIGxldCBmcyA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocylbMF07IHZhciBcbmU7XG4gICAgICBpZiAoZC5nZXRFbGVtZW50QnlJZChpZCkpIHJldHVybjtcbiAgICAgIGUgPSBkLmNyZWF0ZUVsZW1lbnQocykgYXMgSFRNTFNjcmlwdEVsZW1lbnQ7IGUuaWQgPSBpZDsgZS5zcmMgPSBvLnNyYztcbiAgICAgIGUuc2V0QXR0cmlidXRlKCdkYXRhLWdjYi11cmwnLCBvLmNiVXJsKTtcbiAgICAgIGZzLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShlLCBmcyk7XG4gICAgfShkb2N1bWVudCwgJ3NjcmlwdCcsICdnZW5lc3lzLWpzJywge1xuICAgICAgICAgICAgc3JjOiBgJHtjb25maWd1cmF0aW9uLmVudkNvYnJvd3NlVVJMfWpzL2djYi5taW4uanNgLFxuICAgICAgICAgICAgY2JVcmw6IGNvbmZpZ3VyYXRpb24uZW52Q29icm93c2VVUkxcbiAgICAgICAgfSkpO1xuICAgIHdpbmRvdy5fZ2VuZXN5cyA9IGNvbmZpZ3VyYXRpb247XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJFRCwgY29uZmlndXJhdGlvbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0dlbmVzeXMgQ29icm93c2UgRXJyb3InLCBlKTtcbiAgICBpZiAoYmFjdG0gJiYgYmFjdG0ucGx1Z2lucyAmJiBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnKSBiYWN0bS5wbHVnaW5zLnBpeGVsVGFnLmZpcmVQaXhlbFRhZyhgJHtQSVhFTF9UQUdfVVJMfT9lcnJvcj0ke2V9YCk7XG4gICAgaW5jcmVhc2VFcnJvckNvdW50KCk7XG4gIH1cbn1cbiIsIi8vIEB0cy1ub2NoZWNrXG4vKiogQG1vZHVsZSB3aWRnZXQtYXBpL2NvbmZpZ3VyZS1jb2Jyb3dzZSAqL1xuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudERvbWFpbixcbiAgcHVibGlzaFRlYWxpdW0sXG4gIGlzVjYsXG4gIHdoaWNoVmVyc2lvbixcbn0gZnJvbSAnLi4vdXRpbGl0aWVzL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04gfSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcblxuLyoqXG4gKiBIYW5kbGUgY29icm93c2VcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGFuZGxlQ29uZmlndXJlQ29icm93c2UocGF5bG9hZDogeyBkZXRhaWw6IG9iamVjdCB8IHVuZGVmaW5lZDsgfSkge1xuICBjb25zdCB2NiA9IGlzVjYoKTtcbiAgY29uc3Qgd2hpY2hDaGF0ID0gdjYgPyAnZ3QtY2hhdC13aWRnZXQnOiAnd3d3LWNoYXQnO1xuICBjb25zdCB3aWRnZXRWZXJzaW9uID0gd2hpY2hWZXJzaW9uKCk7XG4gIGNvbnN0IGN1cnJlbnRUTEQgPSBnZXRDdXJyZW50RG9tYWluKCk7XG4gIHB1Ymxpc2hUZWFsaXVtKEdFTkVTWVNfQ09CUk9XU0VfQ09ORklHVVJBVElPTixcbiAgICB7IC4uLnBheWxvYWQuZGV0YWlsLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgIGVudkNvYnJvd3NlVVJMOiBzcGFXaWRnZXRQYXJhbXNbd2hpY2hDaGF0XVt3aWRnZXRWZXJzaW9uXS5zaXRlUGFyYW1zLmRvbWFpbnNbY3VycmVudFRMRF0uY29icm93c2UsXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQHRzLW5vY2hlY2tcbi8qKiBAbW9kdWxlIHdpZGdldC1hcGkvc2VuZC1kaXNwb3NpdGlvbi1jb2RlICovXG5pbXBvcnQge1xuICBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX0ZBSUxVUkUsXG4gIEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HLFxuICBQSVhFTF9UQUdfVVJMLFxufSBmcm9tICcuLi93aWRnZXQtY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgZ2V0Q3VycmVudERvbWFpbixcbiAgd2hpY2hWZXJzaW9uLFxuICBpbmNyZWFzZUVycm9yQ291bnQsXG4gIGxvZ0dlbmVzeXNFdmVudCxcbiAgaXNWNlxufSBmcm9tICcuLi91dGlsaXRpZXMvdXRpbGl0aWVzJztcblxuLyoqXG4gKiBHV0UgQ2hhdCBEaXNwb3NpdGlvbiBSZXNwb25zZSAtIEZhaWx1cmVcbiAqIEBkZXNjIFVwb24gZmFpbHVyZSwgZnVuY3Rpb24gZGVsaXZlcnMgYSBQdWIvU3ViIGV2ZW50IHRvIHNlbmQgZXJyb3IgaW5mb3JtYXRpb24gYmFjayB0byBVSVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmVTZW5kRGlzcG9zaXRpb25Db2RlKGRpc3Bvc2l0aW9uUmVzcG9uc2U6IHVua25vd24pIHtcbiAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdXRV9TRU5EX0RJU1BPU0lUSU9OX0NPREVfRkFJTFVSRSwgZGlzcG9zaXRpb25SZXNwb25zZSk7XG4gIGlmIChiYWN0bSAmJiBiYWN0bS5wbHVnaW5zICYmIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcpIGJhY3RtLnBsdWdpbnMucGl4ZWxUYWcuZmlyZVBpeGVsVGFnKGAke1BJWEVMX1RBR19VUkx9P2Vycm9yPSR7ZGlzcG9zaXRpb25SZXNwb25zZX1gKTtcbiAgbG9nR2VuZXN5c0V2ZW50KDMsICdTdXJ2ZXkgUmVzcG9uc2UgRmFpbHVyZScsIGRpc3Bvc2l0aW9uUmVzcG9uc2UpO1xuICBpbmNyZWFzZUVycm9yQ291bnQoKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdXRSBDaGF0IERpc3Bvc2l0aW9uIFJlc3BvbnNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gcGF5bG9hZFxuICogQGRlc2MgVGhlIGZvbGxvd2luZyBtZXRob2Qgd2lsbCBzZW5kIHRoZSBjdXN0b21lciByZXNwb25zZSB0byBhIHByb2FjdGl2ZSBjaGF0IHJlcXVlc3RcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChldmVudE5hbWU6IGFueSwgcGF5bG9hZDogeyByZXN1bHQ6IHN0cmluZywgZW5nYWdlbWVudElEOiBzdHJpbmcsIHBhZ2VJRDogc3RyaW5nLCB2aXNpdElEOiBzdHJpbmcgfSkge1xuICB0cnkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3VsdCwgZW5nYWdlbWVudElELCBwYWdlSUQsIHZpc2l0SUQsXG4gICAgfSA9IHBheWxvYWQ7XG4gICAgY29uc3Qgd2lkZ2V0VmVyc2lvbiA9IHdoaWNoVmVyc2lvbigpO1xuICAgIGNvbnN0IHY2ID0gaXNWNigpO1xuICAgIGNvbnN0IHdoaWNoQ2hhdCA9IHY2ID8gJ2d0LWNoYXQtd2lkZ2V0JyA6ICd3d3ctY2hhdCc7XG4gICAgY29uc3QgY3VycmVudFRMRCA9IGdldEN1cnJlbnREb21haW4oKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgIGNvbnN0IGludml0ZVVSTCA9IHNwYVdpZGdldFBhcmFtc1t3aGljaENoYXRdW3dpZGdldFZlcnNpb25dLnNpdGVQYXJhbXMuZG9tYWluc1tjdXJyZW50VExEXS5tb25pdG9yaW5nanM7XG4gICAgY29uc3Qgc2VuZERpc3Bvc2l0aW9uVXJsID0gYCR7aW52aXRlVVJMfS9zZXJ2ZXIvZGF0YS9pbnZpdGVzLz9yZXN1bHQ9JHtyZXN1bHR9JmVuZ2FnZW1lbnRJRD0ke2VuZ2FnZW1lbnRJRH0mcGFnZUlEPSR7cGFnZUlEfSZ2aXNpdElEPSR7dmlzaXRJRH1gO1xuICAgIGxvZ0dlbmVzeXNFdmVudCgxLCAnQ2hhdCBEaXNwb3NpdGlvbiBDb2RlJywgcGF5bG9hZCk7XG4gICAgZmV0Y2goc2VuZERpc3Bvc2l0aW9uVXJsLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgfSk7XG4gICAgVGVhbGl1bVB1YlN1Yi5wdWJsaXNoKEdFTkVTWVNfU1VTUEVORF9NT05JVE9SSU5HKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dHZW5lc3lzRXZlbnQoMywgJ0dlbmVzeXMgU3VydmV5IEVycm9yJywgZXJyb3IpO1xuICAgIGZhaWx1cmVTZW5kRGlzcG9zaXRpb25Db2RlKGVycm9yKTtcbiAgfVxufVxuIiwiLy8gQHRzLW5vY2hlY2tcblxuLyoqIEBtb2R1bGUgYmFzZS93aWRnZXQtY29uc3RhbnRzICovXG5cbi8qKlxuICogV2lkZ2V0IGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVFVRVNUID0gJ01PTklUT1JJTkdKU19SRVFVRVNUJztcbmV4cG9ydCBjb25zdCBNT05JVE9SSU5HSlNfSEVBUlRCRUFUID0gJ01PTklUT1JJTkdKU19IRUFSVEJFQVQnO1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdfQ0xFQVJfSEVBUlRCRUFUID0gJ01PTklUT1JJTkdfQ0xFQVJfSEVBUlRCRUFUJztcbmV4cG9ydCBjb25zdCBDT01FVERfTUVUQV9ESVNDT05ORUNUID0gJ0NPTUVURF9NRVRBX0RJU0NPTk5FQ1QnO1xuZXhwb3J0IGNvbnN0IFBNX1NFTkRfU0FMRV9PQ0NVUlJFRCA9ICdQTV9TRU5EX1NBTEVfT0NDVVJSRUQnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfQ0hFQ0tfRk9SX1NBTEUgPSAnR0VORVNZU19DSEVDS19GT1JfU0FMRSc7XG5leHBvcnQgY29uc3QgR0VORVNZU19RVUFMSUZJRURfTEVBRCA9ICdHRU5FU1lTX1FVQUxJRklFRF9MRUFEJztcblxuLyoqXG4gKiBHZW5lc3lzIGNvbmZpZ3VyYXRpb25zICYgcmVxdWVzdCBjb25zdGFudHNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSRUQgPSAnR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkVEJztcbmV4cG9ydCBjb25zdCBHRU5FU1lTX0NPQlJPV1NFX0NPTkZJR1VSQVRJT04gPSAnR0VORVNZU19DT0JST1dTRV9DT05GSUdVUkFUSU9OJztcblxuLyoqXG4gKiBHV0Ugc2VuZCBkaXNwb3NpdGlvbiByZXF1ZXN0LCBzdWNjZXNzLCAmIGZhaWx1cmUgY29uc3RhbnRzXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERSA9ICdHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFJztcbmV4cG9ydCBjb25zdCBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX1NVQ0NFU1MgPSAnR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERV9TVUNDRVNTJztcbmV4cG9ydCBjb25zdCBHV0VfU0VORF9ESVNQT1NJVElPTl9DT0RFX0ZBSUxVUkUgPSAnR1dFX1NFTkRfRElTUE9TSVRJT05fQ09ERV9GQUlMVVJFJztcblxuLyoqXG4gKiBQb3N0IE1lc3NhZ2UgQ29uc3RhbnRzXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgQ0FOQ0VMX0hFQVJUQkVBVCA9ICdDQU5DRUxfSEVBUlRCRUFUJztcbmV4cG9ydCBjb25zdCBDQU5DRUxfV0lER0VUX1NVQlMgPSAnQ0FOQ0VMX1dJREdFVF9TVUJTJztcbmV4cG9ydCBjb25zdCBDQU5DRUxfU0lURV9TVUJTID0gJ0NBTkNFTF9TSVRFX1NVQlMnO1xuZXhwb3J0IGNvbnN0IENIRUNLX0FIX1RPS0VOID0gJ0NIRUNLX0FIX1RPS0VOJztcbmV4cG9ydCBjb25zdCBDSEVDS19GT1JfU0FMRSA9ICdDSEVDS19GT1JfU0FMRSc7XG5leHBvcnQgY29uc3QgR1JBQl9IRUFSVEJFQVRfREFUQSA9ICdHUkFCX0hFQVJUQkVBVF9EQVRBJztcbmV4cG9ydCBjb25zdCBTRVRfTU9OSVRPUklOR19TVEFUVVMgPSAnU0VUX01PTklUT1JJTkdfU1RBVFVTJztcbmV4cG9ydCBjb25zdCBTRU5EX1BST1hZX0RBVEEgPSAnU0VORF9QUk9YWV9EQVRBJztcbmV4cG9ydCBjb25zdCBNQVhfRVJSX1JFVFJJRVMgPSAzO1xuXG4vKipcbiAqIHJlc3BvbnNlIGZhaWx1cmVzIGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVNQT05TRV9GQUlMVVJFID0gJ01PTklUT1JJTkdKU19SRVNQT05TRV9GQUlMVVJFJztcbmV4cG9ydCBjb25zdCBNT05JVE9SSU5HSlNfSEVBUlRCRUFUX0ZBSUxVUkUgPSAnTU9OSVRPUklOR0pTX0hFQVJUQkVBVF9GQUlMVVJFJztcblxuLyoqXG4gKiByZXNwb25zZSBzdWNjZXNzIGNvbnN0YW50c1xuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdKU19SRVNQT05TRSA9ICdNT05JVE9SSU5HSlNfUkVTUE9OU0UnO1xuZXhwb3J0IGNvbnN0IE1PTklUT1JJTkdfSURfUkVTUE9OU0UgPSAnTU9OSVRPUklOR19JRF9SRVNQT05TRSc7XG5cbi8qKlxuICogY2hhdCAmIHdpZGdldCBjb25zdGFudHNcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBzcGFydGFMb2FkZXJMb2FkZWQgPSAnc3BhcnRhTG9hZGVyTG9hZGVkJztcbmV4cG9ydCBjb25zdCBlcnJvckxvYWRpbmdXaWRnZXQgPSAnZXJyb3JMb2FkaW5nV2lkZ2V0JztcbmV4cG9ydCBjb25zdCBDSEFUX0lOSVRJQUxJWkFUSU9OID0gJ0NIQVRfSU5JVElBTElaQVRJT04nO1xuZXhwb3J0IGNvbnN0IFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT04gPSAnV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTic7XG5leHBvcnQgY29uc3QgU1BBUlRBX1dJREdFVF9SRUFEWSA9ICdTUEFSVEFfV0lER0VUX1JFQURZLnNwYXJ0YVdpZGdldFV0aWxpdHknO1xuZXhwb3J0IGNvbnN0IFdJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fRVJST1IgPSAnV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9FUlJPUic7XG5leHBvcnQgY29uc3QgV0lER0VUX1JFUVVFU1RfQ09ORklHVVJBVElPTl9TVUNDRVNTRlVMID0gJ1dJREdFVF9SRVFVRVNUX0NPTkZJR1VSQVRJT05fU1VDQ0VTU0ZVTCc7XG5cbi8qKlxuICogZ2VuZXN5cyBmZXRjaCBzZXNzaW9uIGNvbnN0YW50c1xuICogdGhpcyBpcyBzcGVjaWZpYyB0byBjaGF0IEFDUyBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaW5zaWRlIG13ZWJcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTiA9ICdHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTidcbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9TVUNDRVNTID0gJ0dFTkVTWVNfUkVRVUVTVF9GRVRDSF9TRVNTSU9OX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgR0VORVNZU19SRVFVRVNUX0ZFVENIX1NFU1NJT05fRkFJTFVSRSA9ICdHRU5FU1lTX1JFUVVFU1RfRkVUQ0hfU0VTU0lPTl9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfVVBEQVRFX0NIQVRfREFUQV9FTkRQT0lOVCA9ICcxL3NlcnZpY2UvVXBkYXRlQ2hhdERhdGEnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfRkVUQ0hfU0VTU0lPTl9FTkRQT0lOVCA9ICcxL3NlcnZpY2UvR2V0UmVmSURJbmZvLyc7XG5leHBvcnQgY29uc3QgU0lURV9JTkZPX0FWQUlMQUJMRSA9ICdTSVRFX0lORk9fQVZBSUxBQkxFJztcbmV4cG9ydCBjb25zdCBURUFMSVVNX1JFQURZX0ZPUl9QVUJTVUIgPSAnVEVBTElVTV9SRUFEWV9GT1JfUFVCU1VCJztcblxuLyoqXG4gKiBnZW5lc3lzIG5hdGl2ZSBjaGF0IGV2ZW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR0VORVNZU19SRVFVRVNUX05BVElWRV9DSEFUID0gJ0dFTkVTWVNfUkVRVUVTVF9OQVRJVkVfQ0hBVCc7XG5cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1ZBTElEQVRFX0lQX0FERFJFU1NfU1VDQ0VTUyA9ICdHRU5FU1lTX1ZBTElEQVRFX0lQX0FERFJFU1NfU1VDQ0VTUyc7XG5leHBvcnQgY29uc3QgR0VORVNZU19TRVRfQUdFTlRfSUQgPSAnR0VORVNZU19TRVRfQUdFTlRfSUQnO1xuXG4vKipcbiAqIGdlbmVzeXMgcmVxdWVzdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyB1cGRhdGUgZXZlbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFID0gJ0dFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEUnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfU1VDQ0VTUyA9ICdHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX1NVQ0NFU1MnO1xuZXhwb3J0IGNvbnN0IEdFTkVTWVNfUkVRVUVTVF9UQ19VUERBVEVfRkFJTFVSRSA9ICdHRU5FU1lTX1JFUVVFU1RfVENfVVBEQVRFX0ZBSUxVUkUnO1xuXG5leHBvcnQgY29uc3QgY2hhdFNpdGVQYXJhbXMgPSB7XG4gIHNwYVBhcmFtczogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIFBpeGVsIFRhZyBVUkwgZm9yIEVycm9yIExvZ2dpbmdcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBQSVhFTF9UQUdfVVJMID0gJ2h0dHBzOi8vd3d3LmJhbmtvZmFtZXJpY2EuY29tL3BhL2dsb2JhbC1hc3NldHMvMS4wL2dyYXBoaWMvY2xyLmdpZic7XG5cbi8qKlxuICogTW9iaWxlIEFDUyBMb2dnZXIgU2VydmljZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IEFDU19MT0dHRVJfVVJMID0gJy9tZ2F0ZXdheS92MS9jbGllbnRMb2dnZXIvbG9nJztcbmV4cG9ydCBjb25zdCBBQ1NfTE9HR0VSX1BVQkxJQ19VUkwgPSAnL21nYXRld2F5L3B1YmxpYy92MS9jbGllbnRMb2dnZXIvbG9nJztcblxuXG4vKipcbiAqIEluaXQgQ2hhdCBDb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRfQ0hBVCA9ICdJTklUX0NIQVQnO1xuXG4vKipcbiAqIFN1c3BlbmQgSGVhcnRiZWF0IENvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcgPSAnR0VORVNZU19TVVNQRU5EX01PTklUT1JJTkcnO1xuXG4vKipcbiAqIFJlbGVhc2UgYW5kIEVudmlyb25tZW50YWwgQ29uc3RhbnRzXG4gKiBAdHlwZSB7YXJyYXl9XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgTUVSUklMTCA9ICdNRVJSSUxMJztcbmV4cG9ydCBjb25zdCBJTlRFUk5BTCA9ICdJTlRFUk5BTCc7XG5leHBvcnQgY29uc3QgQk9GQSA9ICdCT0ZBJztcbmV4cG9ydCBjb25zdCBTUEFSVEEgPSAnU1BBUlRBJztcbmV4cG9ydCBjb25zdCBCT0ZBX0RPTUFJTlMgPSBbXG4gICdkZXYxLicsXG4gICdkZXYyLiwnLFxuICAnZGV2My4nLFxuICAnZGV2NC4nLFxuICAnZGV2ZmxleC4nLFxuICAnZGV2cHMuJyxcbiAgJ3FhNS4nLFxuICAncWFwcy4nLFxuICAnY2VydDEuJyxcbiAgJ2NlcnQyLicsXG4gICdwdDEuJyxcbiAgJ3B0Mi4nLFxuICAncHJldmlldzEuJyxcbiAgJ3ByZXZpZXcyLicsXG4gICdyZXZpZXcxLicsXG4gICdyZXZpZXcyLicsXG4gICdkZXYxLWhlbGl4LicsXG4gICdkZXYyLWhlbGl4LicsXG4gICdkZXYzLWhlbGl4LicsXG4gICdkZXY0LWhlbGl4LicsXG4gICdkZXZmbGV4MS1oZWxpeC4nLFxuICAncHQxLWhlbGl4LicsXG4gICdwdDItaGVsaXguJyxcbiAgJ3Bzc2l0LWhlbGl4LicsXG4gICdwcmV2aWV3MS1oZWxpeC4nLFxuICAncHJldmlldzItaGVsaXguJyxcbiAgJ3JldmlldzEtaGVsaXguJyxcbiAgJ3JldmlldzItaGVsaXguJyxcbiAgJ3NpdDFhLWhlbGl4LicsXG4gICdzaXQyYS1oZWxpeC4nLFxuICAnc2l0My1oZWxpeC4nLFxuICAnc2l0YmMtaGVsaXguJyxcbl07XG5leHBvcnQgY29uc3QgSVJfRU5WID0ge1xuICBERVY6ICdkZXY0JyxcbiAgQ0VSVDogJ3NpdDFhJyxcbn07XG5cbi8qKlxuICogU2FsZSBJbmRpY2F0b3JzIENvbnN0YW50cyBBcnJheVxuICogQHR5cGUge2FycmF5fVxuICovXG5leHBvcnQgY29uc3QgTUxfU0FMRV9JTkRJQ0FUT1JTID0gW1xuICAnaW5xQ2xpZW50T3JkZXJOdW0nLFxuICAnTUxEX09BT19DT05GSVJNQVRJT05OVU1CRVInLFxuICAnTUxEX09BT19BQ0NPVU5UTlVNQkVSJyxcbl07XG5leHBvcnQgY29uc3QgQk9GQV9TQUxFX0lORElDQVRPUlMgPSBbXG4gICdhcHBsaWNhdGlvbklEJyxcbl07XG5leHBvcnQgY29uc3QgSU5RX0NMSUVOVF9PUkRFUl9OVU0gPSAnaW5xQ2xpZW50T3JkZXJOdW0nO1xuZXhwb3J0IGNvbnN0IENPT0tJRSA9IHtcbiAgTkFNRTogJ29jY3RDaGF0JyxcbiAgRVhQSVJBVElPTjogMTAsXG4gIERPTUFJTjogJy5iYW5rb2ZhbWVyaWNhLmNvbScsXG4gIFNFQ1VSRTogdHJ1ZSxcbiAgUEFUSDogJy8nLFxufTtcblxuLyoqXG4gKiBHU0lEIENvb2tpZVxuICovXG5leHBvcnQgY29uc3QgQ09PS0lFX0dTSUQgPSB7XG4gIE5BTUU6ICdHU0lEJyxcbiAgRE9NQUlOOiAnLmJhbmtvZmFtZXJpY2EuY29tJyxcbiAgU0VDVVJFOiB0cnVlLFxuICBQQVRIOiAnLycsXG59OyIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xudmFyIGcgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpIHx8XG4gIHt9XG5cbnZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIGcsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnICYmXG4gICAgJ0Jsb2InIGluIGcgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGcsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH4hXS9pLnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZTogXCInICsgbmFtZSArICdcIicpXG4gIH1cbiAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuZnVuY3Rpb24gaXRlcmF0b3JGb3IoaXRlbXMpIHtcbiAgdmFyIGl0ZXJhdG9yID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKVxuICAgICAgcmV0dXJuIHtkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWV9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXRlcmF0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhlYWRlcnMoaGVhZGVycykge1xuICB0aGlzLm1hcCA9IHt9XG5cbiAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICB9LCB0aGlzKVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICBpZiAoaGVhZGVyLmxlbmd0aCAhPSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0hlYWRlcnMgY29uc3RydWN0b3I6IGV4cGVjdGVkIG5hbWUvdmFsdWUgcGFpciB0byBiZSBsZW5ndGggMiwgZm91bmQnICsgaGVhZGVyLmxlbmd0aClcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5Ll9ub0JvZHkpIHJldHVyblxuICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKSlcbiAgfVxuICBib2R5LmJvZHlVc2VkID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgfVxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2JBc1RleHQoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHZhciBtYXRjaCA9IC9jaGFyc2V0PShbQS1aYS16MC05Xy1dKykvLmV4ZWMoYmxvYi50eXBlKVxuICB2YXIgZW5jb2RpbmcgPSBtYXRjaCA/IG1hdGNoWzFdIDogJ3V0Zi04J1xuICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBlbmNvZGluZylcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ub0JvZHkgPSB0cnVlO1xuICAgICAgdGhpcy5fYm9keVRleHQgPSAnJ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmxvYiAmJiBCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuZm9ybURhdGEgJiYgRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlGb3JtRGF0YSA9IGJvZHlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5LnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgc3VwcG9ydC5ibG9iICYmIGlzRGF0YVZpZXcoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgLy8gSUUgMTAtMTEgY2FuJ3QgaGFuZGxlIGEgRGF0YVZpZXcgYm9keS5cbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gbmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ3RleHQvcGxhaW47Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgdGhpcy5fYm9keUJsb2IudHlwZSlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgIHRoaXMuYmxvYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSlcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChpc0NvbnN1bWVkKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBhcyBBcnJheUJ1ZmZlcicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0NPTk5FQ1QnLCAnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUEFUQ0gnLCAnUE9TVCcsICdQVVQnLCAnVFJBQ0UnXVxuXG5mdW5jdGlvbiBub3JtYWxpemVNZXRob2QobWV0aG9kKSB7XG4gIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWVzdChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQbGVhc2UgdXNlIHRoZSBcIm5ld1wiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICBpZiAoaW5wdXQuYm9keVVzZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgfVxuICAgIHRoaXMudXJsID0gaW5wdXQudXJsXG4gICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpXG4gICAgfVxuICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kXG4gICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZVxuICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsXG4gICAgaWYgKCFib2R5ICYmIGlucHV0Ll9ib2R5SW5pdCAhPSBudWxsKSB7XG4gICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICBpbnB1dC5ib2R5VXNlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy51cmwgPSBTdHJpbmcoaW5wdXQpXG4gIH1cblxuICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdzYW1lLW9yaWdpbidcbiAgaWYgKG9wdGlvbnMuaGVhZGVycyB8fCAhdGhpcy5oZWFkZXJzKSB7XG4gICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB9XG4gIHRoaXMubWV0aG9kID0gbm9ybWFsaXplTWV0aG9kKG9wdGlvbnMubWV0aG9kIHx8IHRoaXMubWV0aG9kIHx8ICdHRVQnKVxuICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgdGhpcy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbCB8fCB0aGlzLnNpZ25hbCB8fCAoZnVuY3Rpb24gKCkge1xuICAgIGlmICgnQWJvcnRDb250cm9sbGVyJyBpbiBnKSB7XG4gICAgICB2YXIgY3RybCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJldHVybiBjdHJsLnNpZ25hbDtcbiAgICB9XG4gIH0oKSk7XG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1Jlc3BvbnNlICcgKyBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICBpZiAodGhpcy5zdGF0dXMgPCAyMDAgfHwgdGhpcy5zdGF0dXMgPiA1OTkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Jlc3BvbnNlJzogVGhlIHN0YXR1cyBwcm92aWRlZCAoMCkgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzIwMCwgNTk5XS5cIilcbiAgfVxuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAyMDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2Uub2sgPSBmYWxzZVxuICByZXNwb25zZS5zdGF0dXMgPSAwXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZy5ET01FeGNlcHRpb25cbnRyeSB7XG4gIG5ldyBET01FeGNlcHRpb24oKVxufSBjYXRjaCAoZXJyKSB7XG4gIERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHZhciBlcnJvciA9IEVycm9yKG1lc3NhZ2UpXG4gICAgdGhpcy5zdGFjayA9IGVycm9yLnN0YWNrXG4gIH1cbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRE9NRXhjZXB0aW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCAmJiByZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgZnVuY3Rpb24gYWJvcnRYaHIoKSB7XG4gICAgICB4aHIuYWJvcnQoKVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgY2hlY2sgaWYgc3BlY2lmaWNhbGx5IGZvciB3aGVuIGEgdXNlciBmZXRjaGVzIGEgZmlsZSBsb2NhbGx5IGZyb20gdGhlIGZpbGUgc3lzdGVtXG4gICAgICAvLyBPbmx5IGlmIHRoZSBzdGF0dXMgaXMgb3V0IG9mIGEgbm9ybWFsIHJhbmdlXG4gICAgICBpZiAocmVxdWVzdC51cmwuaW5kZXhPZignZmlsZTovLycpID09PSAwICYmICh4aHIuc3RhdHVzIDwgMjAwIHx8IHhoci5zdGF0dXMgPiA1OTkpKSB7XG4gICAgICAgIG9wdGlvbnMuc3RhdHVzID0gMjAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgICAgfVxuICAgICAgb3B0aW9ucy51cmwgPSAncmVzcG9uc2VVUkwnIGluIHhociA/IHhoci5yZXNwb25zZVVSTCA6IG9wdGlvbnMuaGVhZGVycy5nZXQoJ1gtUmVxdWVzdC1VUkwnKVxuICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlc29sdmUobmV3IFJlc3BvbnNlKGJvZHksIG9wdGlvbnMpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCB0aW1lZCBvdXQnKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZml4VXJsKHVybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVybCA9PT0gJycgJiYgZy5sb2NhdGlvbi5ocmVmID8gZy5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlclxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzIHx8IChnLkhlYWRlcnMgJiYgaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgZy5IZWFkZXJzKSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgbmFtZXMucHVzaChub3JtYWxpemVOYW1lKG5hbWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKVxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWcuZmV0Y2gpIHtcbiAgZy5mZXRjaCA9IGZldGNoXG4gIGcuSGVhZGVycyA9IEhlYWRlcnNcbiAgZy5SZXF1ZXN0ID0gUmVxdWVzdFxuICBnLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy9AdHMtbm9jaGVja1xuXG5pbXBvcnQgXCJ3aGF0d2ctZmV0Y2hcIjtcbmltcG9ydCBcIi4vcHVic3ViL2Jvb3RzdHJhcFwiO1xuaW1wb3J0IFwiLi9wdWJzdWIvcG9zdC1tZXNzYWdlc1wiO1xuaW1wb3J0IHBsYWNlaG9sZGVyIGZyb20gXCIuL3B1YnN1Yi9wbGFjZWhvbGRlclwiO1xuaW1wb3J0IHdpZGdldFNjcmlwdCBmcm9tIFwiLi9wdWJzdWIvd2lkZ2V0LXNjcmlwdFwiO1xuaW1wb3J0IGdlbmVzeXNEYXRhSW5pdCBmcm9tIFwiLi9zYWxlcy9nZW5lc3lzLWRhdGFcIjtcbmltcG9ydCB3aWRnZXRTY3JpcHRMb2FkZWQgZnJvbSBcIi4vcHVic3ViL3dpZGdldC1zY3JpcHQtbG9hZGVkXCI7XG5cbmltcG9ydCB7XG4gIGNoZWNrV3JhcCxcbiAgcHJveHlDaGF0RERPLFxuICBtb2NrUmVmSUQsXG4gIHFzTG9iU2V0dGVyLFxuICBpc1VuaXZlcnNhbEhlYWRlcixcbiAgaXNWNlxufSBmcm9tIFwiLi91dGlsaXRpZXMvdXRpbGl0aWVzXCI7XG5cbmltcG9ydCB7IElOSVRfQ0hBVCB9IGZyb20gXCIuL3dpZGdldC1jb25zdGFudHNcIjtcblxuLyoqXG4gKiBMb2FkIENoYXQgV2lkZ2V0XG4gKlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gbG9hZHMgY2hhdCB3aWRnZXQsIGJ1dCBhbHNvIGRvZXMgc2V2ZXJhbCBvdGhlciB0aGluZ3M6XG4gKlxuICogLSBHZW5lc3lzIERhdGEgaXMgcG9wdWxhdGVkXG4gKiAtIENoYXQgUGxhY2Vob2xkZXIgaXMgYWRkZWRcbiAqIC0gV2lkZ2V0IFNjcmlwdCAmIFBvbHlmaWxsIGFkZGVkXG4gKiAtIE1vY2sgUmVmIElEIFVzZSBDYXNlXG4gKiAtIFByb3h5IENoYXQgRERPXG4gKiAtIFNlY3VyZSBBZ2VudHNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBsb2FkQ2hhdFdpZGdldCA9ICgpID0+IHtcbiAgZ2VuZXN5c0RhdGFJbml0KCk7XG4gIHBsYWNlaG9sZGVyKCk7XG5cbiAgLy8gSXMgVjZcbiAgY29uc3QgdjYgPSBpc1Y2KCk7XG4gIHdpZGdldFNjcmlwdCgpO1xuICBpZiAodjYpIHtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQgPSB7fTtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyID0gd2luZG93LnNwYXJ0YS53aWRnZXRMb2FkZXJbXCI2LjAuOVwiXTtcbiAgICB3aW5kb3cuc3BhcnRhLmNoYXQud2lkZ2V0TG9hZGVyLnN1YiA9IChtZXNzYWdlOiBzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uKSA9PiB7IH07XG4gICAgd2luZG93LnNwYXJ0YS5jaGF0LndpZGdldExvYWRlci5wdWIgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHsgfTtcbiAgfVxuICAvLyBub25lIG9mIHRoaXMgY29kZSBiZWluZyByYW5cbiAgd2lkZ2V0U2NyaXB0TG9hZGVkKCk7XG4gIG1vY2tSZWZJRCgpO1xuICBwcm94eUNoYXRERE8od2luZG93LmRpZ2l0YWxEYXRhLnBhZ2UuYXR0cmlidXRlcy5jaGF0LCBcInNpdGVfaWRcIik7XG5cbiAgaWYgKHR5cGVvZiBiYWN0bSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNvbnN0IGFnZW50TFRTID0gYmFjdG0uU3RvcmUoXCJjaGF0XCIsIHsgdHlwZTogXCJjb29raWVcIiB9KTtcbiAgICBpZiAoYWdlbnRMVFMuZ2V0KFwic2VjdXJlQWdlbnRJRFwiKSkge1xuICAgICAgY29uc3QgYWdlbnRJRCA9IGFnZW50TFRTLmdldChcInNlY3VyZUFnZW50SURcIik7XG4gICAgICBkaWdpdGFsRGF0YS5wYWdlLmF0dHJpYnV0ZXMuY2hhdC5hZ2VudF9pZCA9IGFnZW50SUQ7XG4gICAgfVxuICAgIHFzTG9iU2V0dGVyKCk7XG4gICAgYmFjdG0uZGRvLnNldChcInBhZ2UuYXR0cmlidXRlcy5jaGF0Lm1vYmlsZUluZGljYXRvclwiLCBjaGVja1dyYXAoKSk7XG4gIH1cbn07XG5cblxuXG5cbi8qKlxuICogQXV0aGVudGljYXRlZCBMaXN0ZW5lclxuICpcbiAqXG4gKiBHcmlmZmlucyBVbml2ZXJzYWwgSGVhZGVyIHdpbGwgZGlzcGF0Y2ggZXZlbnQgdG8gbm90aWZ5XG4gKiBDaGF0IGlmIHVzZXIgaXMgeW91dGggb3Igbm90XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXV0aGVudGljYXRlZExpc3RlbmVyID0gKCkgPT4ge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgIFwiZGlnaXRhbERhdGEuYXV0aC5yZWFkeVwiLFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHsgeW91dGhQcm9wRXhpc3QsIHlvdXRoUHJvcCB9ID0gdmVyaWZ5WW91dGhQcm9maWxlKCk7XG4gICAgICBpZiAoeW91dGhQcm9wRXhpc3QpIHtcbiAgICAgICAgaWYgKCF5b3V0aFByb3ApIHtcbiAgICAgICAgICBsb2FkQ2hhdFdpZGdldCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeW91dGhQcm9wKSByZXR1cm47XG4gICAgICB9XG4gICAgfSxcbiAgICB0cnVlXG4gICk7XG59O1xuXG4vKipcbiAqIFNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uIExpc3RlbmVyXG4gKlxuICpcbiAqIExpc3RlbmVyIGZvciBiYWN0bS5vbignYWZ0ZXJQYWdldmlldycpXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc2luZ2xlUGFnZUFwcGxpY2F0aW9uTGlzdGVuZXIgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gRW5zdXJlIGJhY3RtIGhhcyB0aGUgY29ycmVjdCB0eXBlIG9yIGNhc3QgaXQgdG8gYSB0eXBlIHRoYXQgaW5jbHVkZXMgJ29uJ1xuICAgICgoYmFjdG0gYXMgdW5rbm93bikgYXMgeyBvbjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikgPT4gdm9pZCB9KT8ub24oXCJhZnRlclBhZ2V2aWV3XCIsIG9uQmFjdG1QYWdlVmlldyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBPbiBCYWN0bSBQYWdlIFZpZXdcbiAqXG4gKlxuICogQ2FsbGJhY2sgZm9yIHdoZW4gYmFjdG0ucGFnZXZpZXcgaXMgdHJpZ2dlcmVkXG4gKi9cbmNvbnN0IG9uQmFjdG1QYWdlVmlldyA9IChkYXRhOiB7IHBhZ2VJbmZvPzogeyBjaGF0PzogeyBkaXNhYmxlZD86IGJvb2xlYW47IHNpdGVfaWQ/OiBzdHJpbmcgfSB9IH0pID0+IHtcbiAgY29uc3QgY2hhdERpc2FibGVkID0gZGF0YT8ucGFnZUluZm8/LmNoYXQ/LmRpc2FibGVkIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpdGVJRCA9IGRhdGE/LnBhZ2VJbmZvPy5jaGF0Py5zaXRlX2lkO1xuICBjb25zdCBzZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkID0gKHdpbmRvdz8uZGlnaXRhbERhdGE/LnBhZ2U/LmF0dHJpYnV0ZXM/LmNoYXQgYXMgeyBzZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkPzogc3RyaW5nIH0pPy5zZXJ2aWNlc0xpdmVQZXJzb25FbmFibGVkO1xuICBjb25zdCBiYWN0bUNvb2tpZXMgPSBuZXcgYmFjdG0uQ29va2llcygpO1xuICBjb25zdCBjb29raWVFeGlzdHMgPSBiYWN0bUNvb2tpZXMuZ2V0KFwib2NjdENoYXRcIik7XG4gIGNvbnN0IG9jY3RDaGF0Q29va2llID0gY29va2llRXhpc3RzID8gSlNPTi5wYXJzZShjb29raWVFeGlzdHMpIDogXCJcIjtcbiAgY29uc3QgaXNDaGF0T25nb2luZyA9IG9jY3RDaGF0Q29va2llPy5zZWN1cmVLZXkgJiYgb2NjdENoYXRDb29raWUuc2VjdXJlS2V5ICE9PSBcIlwiO1xuICBpZiAoc2VydmljZXNMaXZlUGVyc29uRW5hYmxlZCA9PT0gXCJOT1wiICYmICFpc0NoYXRPbmdvaW5nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjaGF0RGlzYWJsZWQpIHNldENoYXRTaXRlKHsgc2l0ZUlEOiBmYWxzZSB9KTtcbiAgaWYgKHNpdGVJRCkgc2V0Q2hhdFNpdGUoeyBzaXRlSUQ6IHNpdGVJRCBhcyB1bmtub3duIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQgfSk7XG4gIHdpbmRvdz8uYm9hPy5jaGF0Py5yZWxvYWQoKTtcbn07XG5cbi8qKlxuICogU2V0IENoYXQgU2l0ZSBJRFxuICpcbiAqXG4gKiBTZXQgU0lURV9JRCAmIHNpdGVfaWQgaW5zaWRlIG9mIERET1xuICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gc2l0ZUlEXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc2V0Q2hhdFNpdGUgPSAoeyBzaXRlSUQgPSBmYWxzZSB9KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2hhdEF0dHJpYnV0ZXMgPSB3aW5kb3cuZGlnaXRhbERhdGEucGFnZS5hdHRyaWJ1dGVzLmNoYXQgYXMgeyBzaXRlX2lkPzogYm9vbGVhbiB8IHN0cmluZzsgU0lURV9JRD86IGJvb2xlYW4gfCBzdHJpbmcgfTtcbiAgICBjaGF0QXR0cmlidXRlcy5zaXRlX2lkID0gc2l0ZUlEO1xuICAgIGNoYXRBdHRyaWJ1dGVzLlNJVEVfSUQgPSBzaXRlSUQ7XG4gICAgd2luZG93LmNoYXRTcGFSZWFkeSA9IHRydWU7XG4gICAgd2luZG93Py5zcGFydGE/LmNoYXQ/LndpZGdldExvYWRlcj8ucHViKFwic3RhcnRDaGF0U1BBXCIsIHsgc2l0ZUlEIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IFlvdXRoIFByb2ZpbGVcbiAqXG4gKlxuICogRmFtaWx5IEJhbmtpbmcgUHJvamVjdCAtIENoZWNrIGlmIHlvdXRoIHByb3BlcnR5IGV4aXN0XG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCB2ZXJpZnlZb3V0aFByb2ZpbGUgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB3aW5kb3c/LmRpZ2l0YWxEYXRhPy51c2VyIGFzIHsgeW91dGg/OiBzdHJpbmcgfCBib29sZWFuIH07XG4gIGNvbnN0IHlvdXRoUHJvcEV4aXN0ID0gdXNlcj8uaGFzT3duUHJvcGVydHkoXCJ5b3V0aFwiKTtcbiAgY29uc3QgeW91dGhQcm9wID0gdXNlcj8ueW91dGggPT09IFwidHJ1ZVwiIHx8IHVzZXI/LnlvdXRoID09PSB0cnVlO1xuICByZXR1cm4geyB5b3V0aFByb3AsIHlvdXRoUHJvcEV4aXN0IH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IFNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uXG4gKlxuICpcbiAqIFN0YXJ0IGEgU2luZ2xlIFBhZ2UgQXBwbGljYXRpb24gaWYgaXNTcGEgaXMgcG91cGxhdGVkXG4gKiBib29sZWFuIHRydWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBzdGFydFNpbmdsZVBhZ2VBcHBsaWNhdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgZGVsYXllZENoYXQgPSB7IGZpcmVkOiBmYWxzZSB9O1xuICBjb25zdCBwYWdlVmlld3MgPSBBcnJheS5pc0FycmF5KHdpbmRvdz8uZGF0YUNvbGxlY3RvcilcbiAgICA/IHdpbmRvdy5kYXRhQ29sbGVjdG9yLmZpbHRlcigoeyBldmVudCB9KSA9PiBldmVudCA9PT0gXCJwYWdldmlld1wiKVxuICAgIDogW107XG4gIGlmIChwYWdlVmlld3MubGVuZ3RoID09PSAwKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJndC5zaG93Q2hhdC5yZWFkeVwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGRlbGF5ZWRDaGF0LmZpcmVkKSByZXR1cm47XG4gICAgICBzaW5nbGVQYWdlQXBwbGljYXRpb25MaXN0ZW5lcigpO1xuICAgICAgZGVsYXllZENoYXQuZmlyZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYWdlVmlldyA9IHBhZ2VWaWV3c1twYWdlVmlld3MubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgcGFnZUluZm86IGRpZ2l0YWxEYXRhPy5wYWdlPy5wYWdlSW5mbz8uW3BhZ2VWaWV3LnBhZ2VJbmZvS2V5XSxcbiAgfTtcbiAgb25CYWN0bVBhZ2VWaWV3KHBheWxvYWQpO1xuICBzaW5nbGVQYWdlQXBwbGljYXRpb25MaXN0ZW5lcigpO1xufTtcblxuLyoqXG4gKiBTdGFydCBDaGF0IFBsYXRmb3JtXG4gKlxuICpcbiAqIEJlZ2lubmluZyBvZiBDaGF0IFBsYXRmb3JtLiBGaXJzdCBsaW5lIG9mIGNvZGUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3Qgc3RhcnRDaGF0UGxhdGZvcm0gPSAoKSA9PiB7XG4gIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IGlzVW5pdmVyc2FsSGVhZGVyKCk7XG4gIGNvbnN0IGRpc2FibGVDaGF0ID1cbiAgICB3aW5kb3cuZGlnaXRhbERhdGEgJiYgd2luZG93LmRpZ2l0YWxEYXRhLmRpc2FibGVDaGF0T25Mb2FkID09PSB0cnVlO1xuXG4gIGlmIChkaXNhYmxlQ2hhdCkge1xuICAgIFRlYWxpdW1QdWJTdWIuc3Vic2NyaWJlKElOSVRfQ0hBVCwgKCkgPT4ge30pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgbG9hZENoYXRXaWRnZXQoKTtcbiAgICBpZiAod2luZG93Py5kaWdpdGFsRGF0YT8ucGFnZT8uYXR0cmlidXRlcz8uY2hhdD8uaXNTcGEpIHtcbiAgICAgIHN0YXJ0U2luZ2xlUGFnZUFwcGxpY2F0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh3aW5kb3c/LmRpZ2l0YWxEYXRhPy5wYWdlPy5hdHRyaWJ1dGVzPy5jaGF0Py5pc1NwYSkge1xuICAgIGxvYWRDaGF0V2lkZ2V0KCk7XG4gICAgc3RhcnRTaW5nbGVQYWdlQXBwbGljYXRpb24oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IHlvdXRoUHJvcEV4aXN0LCB5b3V0aFByb3AgfSA9IHZlcmlmeVlvdXRoUHJvZmlsZSgpO1xuXG4gIGlmICh5b3V0aFByb3BFeGlzdCkge1xuICAgIGlmICgheW91dGhQcm9wKSB7XG4gICAgICBsb2FkQ2hhdFdpZGdldCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoeW91dGhQcm9wKSByZXR1cm47XG4gIH1cblxuICBhdXRoZW50aWNhdGVkTGlzdGVuZXIoKTtcbn07XG5cbigoKSA9PiBzdGFydENoYXRQbGF0Zm9ybSgpKSgpO1xuIl0sIm5hbWVzIjpbIkFDU19MT0dHRVJfVVJMIiwibG9nR2VuZXN5c0V2ZW50IiwibW9iaWxlQUNTTG9nZ2VyU2VydmljZSIsImxhYmVsIiwiZXJyb3IiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJpbmNsdWRlcyIsImJhY3RtX2VudlNlbGVjdG9yIiwiZXJyb3JQYXlsb2FkIiwiY29uY2F0IiwibWVzc2FnZSIsImRvbWFpbiIsIm9yaWdpbiIsInJlcGxhY2UiLCJlcnJvclVSTCIsImZldGNoIiwiaGVhZGVycyIsIkFjY2VwdCIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlZGVudGlhbHMiLCJ0aGVuIiwicmVzIiwiY29uc29sZSIsImxvZyIsImUiXSwic291cmNlUm9vdCI6IiJ9 } } catch(e){ utag.DB(e) } }]; u.send = function(a, b) { if (u.ev[a] || u.ev.all !== undefined) { //##UTENABLEDEBUG##utag.DB("send:##UTID##"); var c, d, e, f, i; u.data = { /* Initialize default tag parameter values here */ /* Examples: */ /* "account_id" : "1234567" */ /* "base_url" : "//insert.your.javascript.library.url.here.js" */ /* A value mapped to "account_id" or "base_url" in TiQ will replace these default values. */ }; /* Start Tag-Scoped Extensions Code */ /* Please Do Not Edit This Section */ for(c=0;c